1 条题解
-
0
一、题意理解
1. 模型抽象
- 有 个服务器排成链 。
- 服务器 有缓存时间 :从它收到补丁开始,会把补丁保留 秒,之后删除。
- 边 (连接 与 )有通信时间窗口 ,只能在此时段内传输数据(传输瞬间完成)。
- 传输规则:如果 有补丁(在缓存中)且 没有,且 与 之间的边正在通信窗口中,则 立即传给 。
- 我们可以选择初始服务器 收到补丁的时间 。
- 问:对于每个 ,最小的 使得最终所有服务器都能安装补丁。如果不可能,输出 。
关键:补丁传播是双向的,且依赖于缓存时间与通信窗口的交集。
二、思路分析
1. 传播约束
考虑从 向两边传播的情况。
对于左侧传播(从 传到 ):
- 边 的窗口是 。
- 补丁到达 的时间是某个时刻 (从 一路传过来所花的时间)。
- 为了传到 ,需要 在 的缓存期内与 有交集。
- 即:存在 使得 且 。
等价于:
$$x \leq r_{i-1} \quad\text{且}\quad x \geq l_{i-1} - t_i $$同时 本身必须在 与 的交集非空,这实际上就是上面两个条件。
因此,对于固定的 (到达 的时间),能向左传的条件是:
2. 动态传播区间
设 表示:补丁到达 的时间 的范围,使得从 能向左传播到 号服务器(如果 在左边则向右传播的定义类似)。
我们从 1 到 n 递推 :
- 表示 1 号服务器作为最左端,任何时间收到补丁都能“传到左边”(左边没服务器,自然成功)。
- 对于 :
- 已知 是补丁到达 的时间范围,使得能继续向左传到 1。
- 从 传到 的条件是:到达 的时间 满足 。
- 同时,从 传到 后, 收到补丁的时间就是 (因为如果 ,要等到窗口开启才能传)。
- 这个 必须在 内,才能保证 能继续向左传。
- 因此 要满足:
这等价于:
- 如果 与 无交集,则不可能传到左边,。
- 否则, 的范围是 与 的交集,并考虑 对 的约束。
3. 代码中的简化
你的代码实际上做了简化:
if (fl[i-1].l == -1 || fl[i-1].r == -1) fl[i] = fl[i-1]; else if (l[i-1] > fl[i-1].r || r[i-1] < fl[i-1].l) fl[i] = {-1, -1}; else if (fl[i-1].l <= l[i-1]) fl[i].l = max(0, l[i-1] - t[i]); else fl[i].l = fl[i-1].l; fl[i].r = min(r[i-1], fl[i-1].r);解释:
- 第一行:如果 已经无效,直接继承无效状态。
- 第二行:如果窗口 与 无交集,则 无法传到左边(因为即使传到 , 也不能继续传)。
- 否则:
- 右端点 ,因为 不能超过 (否则无法传),且 必须在 内,所以 。
- 左端点:
- 如果 ,意味着 的最早可行时间 窗口左端,那么为了传到 , 只需满足 (还要非负)。
- 否则(),那么 需要时间 ,因此 至少为 (因为 ,且 ,所以 )。
实际上这里隐含了 必须在 内,所以推导出 的范围是 与 的交集,并做了等价化简。
4. 双向传播
同理,我们计算 :从 能向右传到 的到达时间范围。
初始化 。
从右向左递推,逻辑对称。
5. 合并答案
对于服务器 :
- 补丁从 开始,要向左右两边传播。
- 初始时间 就是补丁到达 的时间。
- 要能传到左边,需要 。
- 要能传到右边,需要 。
- 因此 必须在 中。
取最小的 就是 (如果交集非空)。
如果交集为空,输出 。
三、算法步骤总结
- 读入 。
- 从左到右递推 :
- 。
- 对 ,根据 和边 的窗口 及 计算 。
- 从右到左递推 :
- 。
- 对 ,根据 和边 的窗口 及 计算 。
- 对每个 :
- 如果 与 无交集,输出 。
- 否则输出 。
四、复杂度
- 两次线性递推:。
- 空间 。
五、正确性要点
- 核心是独立处理左右传播,因为链式结构中,向左和向右传播是独立的,只依赖于相邻边和缓存时间。
- 递推公式正确捕捉了“到达时间必须使得下一站能继续传播”的约束。
- 最终合并时,初始时间必须同时满足左右传播条件。
六、举例验证
以样例 3 为例:
n=3 t = [1,2,4] 边1: [7,10] 边2: [3,5]计算 :
- : , 与 交集 ,,所以 ,,得
- : , 与 交集为 ,非空,,所以 ,,得
:
- : , 与 交集 ,,所以 ,,得
- : , 与 无交集,所以
合并:
- : , ,无交集,输出
- : , ,交集 ,输出
- : , ,交集 ,输出
与样例输出一致。
这样就完成了题解。该算法的关键在于双向独立递推传播时间可行区间,最后取交集得到最早可行初始时间。
- 1
信息
- ID
- 6069
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者