1 条题解
-
0
题解:B. Speedbreaker
提示 1
什么时候答案为 ?
提示 2
从城市 开始等价于将 设为 。
详细题解
1. 基本思路与必要区间
在时刻 ,考虑所有满足 的城市。这些城市构成一个最小包含区间 ,即最小的区间使得所有 的城市都落在其中。
关键观察:
在时刻 ,你必须已经征服了 中的所有城市。
因为如果 中还有城市未被征服,那么它的截止时间 就会被违反。因此, 的长度必须 。
若存在某个 使得 ,则无法获胜,答案为 。
2. 构造获胜策略
如果对所有 都有 ,那么至少存在一种获胜策略。
一种构造方法是:依次访问 “时刻 的最小区间”,然后 “时刻 的最小区间”,……,直到 “时刻 的最小区间”。
注意:当访问 “时刻 的最小区间” 时,当前时间恰好等于该区间的长度(因为你每次只能扩展相邻城市),而该长度 。
这样,在时刻 结束时,你已经征服了 中的所有城市(可能还多了一些),满足要求。
3. 起始城市的影响
选择起始城市 等价于将 设为 (因为你在时刻 征服 )。
这会影响最小区间的计算。假设原数组的最小区间为 。
将 改为 后,新区间可能变为:- 若 :新区间为
- 若 :新区间为
- 若 :新区间不变,仍为
要求:对于每个 ,新区间的长度必须 。
4. 转化为对 的限制
以 为例,新区间 的长度为 ,要求 。
即 。同理,若 ,要求 。
若 ,则原区间长度 必须已经 (否则原数组本身就不满足,答案为 )。
因此,对于每个 ,允许的 范围是:
$$x \in [\max(l_t, \, r_t - t + 1), \; \min(r_t, \, l_t + t - 1)] $$更简洁地,可以写成:
$$x \in [l_t, r_t] \cap [r_t - t + 1, \; l_t + t - 1] $$实际上,这等价于要求 同时满足:
并且 还要落在 范围内。
5. 最终区间
对所有 取上述区间的交集,得到起始城市 的允许范围。
最终答案为这个交集的长度(若交集非空)。
6. 另一种等价形式
该题与 2018F3 - Speedbreaker Counting (Hard Version) 的结论一致:
允许的起始城市 必须满足:[ x \in \bigcap_{i=1}^n [i - a_i + 1, ; i + a_i - 1] ]
这个区间的长度即为答案。
证明思路:
从城市 必须在时刻 被征服,意味着在征服过程中,从起点到 的距离(步数)。
这等价于起点 与 的距离 ,即 ,也就是 。对所有 取交集即可。
7. 算法实现
- 初始化 ,
- 遍历 到 :
- 若 ,答案为 ;否则答案为
时间复杂度:,总复杂度 。
总结
- 关键概念:最小包含区间 必须在时刻 内被完全征服。
- 选择起始城市相当于修改 ,从而影响所有最小区间。
- 最终允许的起始城市范围是所有 的交集。
- 1
信息
- ID
- 6262
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者