1 条题解
-
0
题解
问题分析
K的算法实际上是对一棵以餐厅1为根的树进行BFS遍历的过程:
- 第天访问的餐厅对应BFS遍历的第个节点
- 表示该节点的子节点数量
- 条件保证每个餐厅(除1外)恰好被推荐一次,对应树边
关键转化
1. BFS序列的必要条件
对于合法的BFS出度序列:
- (总边数条件)
- 定义前缀和调整:
- 必须满足 对所有
- 且
2. 循环移位问题
我们需要找到所有,使得的循环移位$B^{(k)} = [B_k, B_{k+1}, \ldots, B_{k+N-1} \bmod N]$满足上述条件。
算法思路
1. 构造扩展数组
将复制一份: 这样对应
2. 前缀和预处理
计算的前缀和:
那么的前项和为:(调整边界)
3. 条件检测
对于移位,需要检查:
- 总边数:
- 对于所有:
- 当时:
4. 最小值检测
定义:
$$f(k) = \min_{0 \leq i < N} \left(P[k+i] - P[k-1] - (i+1)\right) $$合法条件为: 且 总边数条件成立。
高效实现
滑动窗口最小值
使用双端队列维护大小为的窗口最小值:
- 在上计算
- 对每个,检查
动态维护
对于交换操作:
- 更新中两个位置的值
- 重新计算受影响的前缀和区间
- 使用线段树维护数组的区间最小值
复杂度分析
- 初始检测:使用滑动窗口
- 每次交换:更新线段树
- 总复杂度:
样例验证
对于初始:
- 扩展
- 计算
- 检测每个的窗口最小值
最终发现只有满足条件。
总结
本题核心在于:
- 将餐厅推荐过程识别为树BFS遍历
- 推导BFS出度序列的数学特征
- 使用滑动窗口和数据结构高效检测所有循环移位
- 支持动态更新操作
通过巧妙的数学转化和数据结构应用,可以在大规模数据下高效解决问题。
- 1
信息
- ID
- 4816
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者