1 条题解

  • 0
    @ 2025-10-30 21:17:10

    题解

    问题分析

    K的算法实际上是对一棵以餐厅1为根的树进行BFS遍历的过程:

    • ii天访问的餐厅对应BFS遍历的第ii个节点
    • AiA_i表示该节点的子节点数量
    • 条件保证每个餐厅(除1外)恰好被推荐一次,对应树边

    关键转化

    1. BFS序列的必要条件

    对于合法的BFS出度序列A0,A1,,AN1A_0, A_1, \ldots, A_{N-1}

    1. i=0N1Ai=N1\sum_{i=0}^{N-1} A_i = N-1(总边数条件)
    2. 定义前缀和调整:si=j=0iAj(i+1)s_i = \sum_{j=0}^i A_j - (i+1)
      • 必须满足si0s_i \geq 0 对所有 0i<N10 \leq i < N-1
      • sN1=1s_{N-1} = -1

    2. 循环移位问题

    我们需要找到所有kk,使得BB的循环移位$B^{(k)} = [B_k, B_{k+1}, \ldots, B_{k+N-1} \bmod N]$满足上述条件。

    算法思路

    1. 构造扩展数组

    BB复制一份:B=B+BB' = B + B 这样B(k)B^{(k)}对应B[k:k+N]B'[k:k+N]

    2. 前缀和预处理

    计算BB'的前缀和:

    P[i]=j=0iB[j]P[i] = \sum_{j=0}^{i} B'[j]

    那么B(k)B^{(k)}的前ii项和为:P[k+i]P[k1]P[k+i] - P[k-1](调整边界)

    3. 条件检测

    对于移位kk,需要检查:

    1. 总边数:P[k+N1]P[k1]=N1P[k+N-1] - P[k-1] = N-1
    2. 对于所有0i<N10 \leq i < N-1P[k+i]P[k1](i+1)0P[k+i] - P[k-1] - (i+1) \geq 0
    3. i=N1i = N-1时:P[k+N1]P[k1]N=1P[k+N-1] - P[k-1] - N = -1

    4. 最小值检测

    定义:

    $$f(k) = \min_{0 \leq i < N} \left(P[k+i] - P[k-1] - (i+1)\right) $$

    合法条件为:f(k)0f(k) \geq 0 且 总边数条件成立。

    高效实现

    滑动窗口最小值

    使用双端队列维护大小为NN的窗口最小值:

    • BB'上计算Q[i]=P[i]iQ[i] = P[i] - i
    • 对每个kk,检查minkj<k+NQ[j]Q[k1]0\min_{k \leq j < k+N} Q[j] - Q[k-1] \geq 0

    动态维护

    对于交换操作BxByB_x \leftrightarrow B_y

    • 更新BB'中两个位置的值
    • 重新计算受影响的前缀和区间
    • 使用线段树维护QQ数组的区间最小值

    复杂度分析

    • 初始检测:O(N)O(N)使用滑动窗口
    • 每次交换:O(logN)O(\log N)更新线段树
    • 总复杂度:O(N+QlogN)O(N + Q\log N)

    样例验证

    对于初始B=[1,2,0,0,1]B = [1,2,0,0,1]

    • 扩展B=[1,2,0,0,1,1,2,0,0,1]B' = [1,2,0,0,1,1,2,0,0,1]
    • 计算Q=[1,2,1,0,0,1,2,1,0,0][0,1,2,3,4,5,6,7,8,9]Q = [1,2,1,0,0,1,2,1,0,0] - [0,1,2,3,4,5,6,7,8,9] =[1,1,1,3,4,4,4,6,8,9]= [1,1,-1,-3,-4,-4,-4,-6,-8,-9]
    • 检测每个kk的窗口最小值

    最终发现只有k=4k=4满足条件。

    总结

    本题核心在于:

    1. 将餐厅推荐过程识别为树BFS遍历
    2. 推导BFS出度序列的数学特征
    3. 使用滑动窗口和数据结构高效检测所有循环移位
    4. 支持动态更新操作

    通过巧妙的数学转化和数据结构应用,可以在大规模数据下高效解决问题。

    • 1

    「CCO 2025」Restaurant Recommendation Rescue

    信息

    ID
    4816
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者