1 条题解

  • 0
    @ 2026-4-2 23:04:40

    题解:F2. 破速者计数(中等版)


    提示 1

    给定一个起始城市,你想获胜。找出几种获胜策略(如果可能),并尝试使用最简单的策略。


    提示 2

    可行的起始城市要么是 00 个,要么是区间

    $$I := \bigcap_{i=1}^{n} [i - a_i + 1,\ i + a_i - 1] = [l, r] $$

    中的所有城市。


    提示 3

    由此可得 aia_i 的一些下界约束。


    提示 4

    固定区间 II,尝试设计一个(较慢的)动态规划。


    提示 5

    计数路径似乎比计数数组更容易。确保对于每个数组,你恰好构造出一条路径(或者容易处理的若干条路径)。


    提示 6

    在你的 DP 中,需要计算多少个不同的状态?


    引理 1

    对于固定的起始城市,如果能够获胜,则以下策略有效:

    策略 1:如果存在右侧的城市,其距离为 tt 且截止时间为 tt 步,则向右走;否则向左走。

    证明

    • 所有右侧的约束都能满足。
    • 该策略最小化到达左侧任何城市的时间。因此,如果任何策略可行,该策略也可行。

    推论

    对于固定的起始城市,如果能够获胜,则以下策略也有效:

    策略 2:如果存在某个城市,其距离为 tt 且截止时间为 tt 步,则向该方向走;否则任意方向。


    引理 2

    可行的起始城市要么是 00 个,要么是区间

    $$I := \bigcap_{i=1}^{n} [i - a_i + 1,\ i + a_i - 1] = [l, r] $$

    中的所有城市。

    证明

    • II 外的城市必败,因为存在至少一个无法到达的城市。
    • II 中任意城市 xx 出发,使用策略 2。
    • 可以证明:对于任意 xIx \in I,策略 2 能先访问 II 中的所有城市,然后再访问其余城市。
    • 因此 II 中的城市要么全胜,要么全败。
    • 区间 II 给出了 aia_i 的下界:aimax(il+1, ri+1)a_i \ge \max(i - l + 1,\ r - i + 1)
    • 可以验证,先访问区间 II 不会违反策略 2。

    推论

    如果使用策略 1,第一次向右移动就决定了 ll


    O(n4)O(n^4) DP

    枚举非空区间 I=[l,r]I = [l, r]。计算下界:

    aimax(il+1, ri+1)a_i \ge \max(i - l + 1,\ r - i + 1)

    注意:策略 1 是确定性的(对于固定的 (起始城市, a)(起始城市,\ a),给出唯一的访问顺序)。接下来我们使用策略 1。

    定义:

    $$dp[i][j][k] = \text{限制在区间 }[i,j]\text{ 上的 }(a,\ 访问顺序)\text{ 对数} $$

    其中 kk 表示“下一步是否被迫向右走”(k{0,1}k \in \{0,1\})。

    转移

    1. [i+1,j][i+1,j] 扩展到 [i,j][i,j]

      • 必须满足 aimax(il+1, ri+1, ji+1)a_i \ge \max(i-l+1,\ r-i+1,\ j-i+1)(因为它在时间 ji+1j-i+1 被访问)
      • 此时 kk 必须为 00
    2. [i,j1][i,j-1] 扩展到 [i,j][i,j],且希望 k=0k=0

      • 必须满足 aj=ji+1a_j = j-i+1(意味着 jj 是迫使你向右走的那个城市)

    在代码中,结果存储在 int_ans[i][j] 中。


    处理“恰好是唯一可行起始城市”

    我们想要统计使得 I=[l,r]I = [l,r] 中的城市是唯一可行起始城市的 (a, 访问顺序)(a,\ 访问顺序) 对数。

    这类似于二维前缀和:

    $$\text{int\_ans}[i][j] \ -= \text{int\_ans}[i-1][j] + \text{int\_ans}[i][j+1] - \text{int\_ans}[i-1][j+1] $$

    对于固定的 aa,访问顺序只取决于起始城市,因此区间 [i,j][i,j] 对应的数组个数为:

    int_ans[i][j]ji+1\frac{\text{int\_ans}[i][j]}{j-i+1}

    这样就解决了 k1k \ge 1 的情况。k=0k=0 的答案就是 nnn^n 减去所有其他答案。


    O(n3)O(n^3) DP

    在上一节中,我们对 O(n2)O(n^2) 个不同的“下界数组”运行了相同的 DP。现在我们要用一次 DP 解决一个固定的 kk

    对于固定的 kk,注意到:如果在长度为 2n2n 的数组上运行 DP,从 I=[nk+1,n]I = [n-k+1, n] 得到的下界数组包含了所有需要的长度为 nn 的子数组作为下界。

    因此可以一次 DP 得到所有结果:

    答案[k]=dp[nk+1][nk+1+n1][0]\text{答案}[k] = dp[n-k+1][n-k+1+n-1][0]

    O(n2)O(n^2) DP

    我们仍然有 O(n3)O(n^3) 个不同的状态。如何简化“下界数组”?

    关键观察:可以分别处理 llrr

    只基于 rr 创建下界数组(得到 O(n2)O(n^2) 个不同状态),然后利用引理 2 的推论找到 ll

    在找到 ll 之前的转移非常简单(总是向左走)。

    一种实现 O(n2)O(n^2) 复杂度的方法是:逆向处理策略 1 和 DP(从时间 nn 到时间 11)。


    最终复杂度

    O(n2)O(n^2)

    算法总结

    1. 对于每个 kk11nn,计算长度为 nn 且恰好有 kk 个可行起始城市的数组个数
    2. 使用逆向 DP,状态数为 O(n2)O(n^2)
    3. k=0k=0 的答案由总数 nnn^n 减去其他答案得到
    4. 所有结果对素数 pp 取模

    关键公式汇总

    • 可行起始城市区间:I=i=1n[iai+1, i+ai1]I = \bigcap_{i=1}^{n} [i-a_i+1,\ i+a_i-1]
    • 下界约束:aimax(il+1, ri+1)a_i \ge \max(i-l+1,\ r-i+1)
    • 访问时间:城市 ii 在区间 [l,r][l,r] 中被访问的时间为 max(il+1, ri+1)\max(i-l+1,\ r-i+1)
    • 数组总数:nnn^n
    • 答案对 pp 取模,pp 为素数
    • 1

    信息

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