1 条题解

  • 0
    @ 2026-4-2 21:09:55

    题解:B. Speedbreaker

    提示 1

    什么时候答案为 00

    提示 2

    从城市 xx 开始等价于将 axa_x 设为 11


    详细题解

    1. 基本思路与必要区间

    在时刻 tt,考虑所有满足 aita_i \le t 的城市。这些城市构成一个最小包含区间 [lt,rt][l_t, r_t],即最小的区间使得所有 aita_i \le t 的城市都落在其中。

    关键观察
    在时刻 tt,你必须已经征服了 [lt,rt][l_t, r_t] 中的所有城市。
    因为如果 [lt,rt][l_t, r_t] 中还有城市未被征服,那么它的截止时间 t\le t 就会被违反。

    因此,[lt,rt][l_t, r_t] 的长度必须 t\le t
    若存在某个 tt 使得 rtlt+1>tr_t - l_t + 1 > t,则无法获胜,答案为 00


    2. 构造获胜策略

    如果对所有 tt 都有 rtlt+1tr_t - l_t + 1 \le t,那么至少存在一种获胜策略。
    一种构造方法是:

    依次访问 “时刻 11 的最小区间”,然后 “时刻 22 的最小区间”,……,直到 “时刻 nn 的最小区间”。

    注意:当访问 “时刻 tt 的最小区间” 时,当前时间恰好等于该区间的长度(因为你每次只能扩展相邻城市),而该长度 t\le t
    这样,在时刻 tt 结束时,你已经征服了 [lt,rt][l_t, r_t] 中的所有城市(可能还多了一些),满足要求。


    3. 起始城市的影响

    选择起始城市 xx 等价于将 axa_x 设为 11(因为你在时刻 11 征服 xx)。
    这会影响最小区间的计算。

    假设原数组的最小区间为 [l,r][l, r]
    axa_x 改为 11 后,新区间可能变为:

    • x<lx < l:新区间为 [x,r][x, r]
    • x>rx > r:新区间为 [l,x][l, x]
    • lxrl \le x \le r:新区间不变,仍为 [l,r][l, r]

    要求:对于每个 tt,新区间的长度必须 t\le t


    4. 转化为对 xx 的限制

    x<lx < l 为例,新区间 [x,r][x, r] 的长度为 rx+1r - x + 1,要求 rx+1tr - x + 1 \le t
    xrt+1x \ge r - t + 1

    同理,若 x>rx > r,要求 xl+t1x \le l + t - 1

    lxrl \le x \le r,则原区间长度 rl+1r - l + 1 必须已经 t\le t(否则原数组本身就不满足,答案为 00)。

    因此,对于每个 tt,允许的 xx 范围是:

    $$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] $$

    实际上,这等价于要求 xx 同时满足:

    • xrtt+1x \ge r_t - t + 1
    • xlt+t1x \le l_t + t - 1

    并且 xx 还要落在 [1,n][1, n] 范围内。


    5. 最终区间

    对所有 t=1,2,,nt = 1, 2, \dots, n 取上述区间的交集,得到起始城市 xx 的允许范围。

    最终答案为这个交集的长度(若交集非空)。


    6. 另一种等价形式

    该题与 2018F3 - Speedbreaker Counting (Hard Version) 的结论一致:
    允许的起始城市 xx 必须满足:

    [ x \in \bigcap_{i=1}^n [i - a_i + 1, ; i + a_i - 1] ]

    这个区间的长度即为答案。

    证明思路:
    从城市 ii 必须在时刻 ai\le a_i 被征服,意味着在征服过程中,从起点到 ii 的距离(步数)ai1\le a_i - 1
    这等价于起点 xxii 的距离 ai1\le a_i - 1,即 xiai1|x - i| \le a_i - 1,也就是 x[iai+1,i+ai1]x \in [i - a_i + 1, i + a_i - 1]

    对所有 ii 取交集即可。


    7. 算法实现

    • 初始化 L=1L = 1R=nR = n
    • 遍历 i=1i = 1nn
      • L=max(L,iai+1)L = \max(L, i - a_i + 1)
      • R=min(R,i+ai1)R = \min(R, i + a_i - 1)
    • L>RL > R,答案为 00;否则答案为 RL+1R - L + 1

    时间复杂度:O(n)O(n),总复杂度 O(n)O(\sum n)


    总结

    • 关键概念:最小包含区间 [lt,rt][l_t, r_t] 必须在时刻 tt 内被完全征服。
    • 选择起始城市相当于修改 ax=1a_x = 1,从而影响所有最小区间。
    • 最终允许的起始城市范围是所有 [iai+1,i+ai1][i - a_i + 1, i + a_i - 1] 的交集。
    • 1

    信息

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