1 条题解

  • 0
    @ 2026-4-2 23:18:28

    题目重述

    nn 个城市排成一行,编号 1,2,,n1,2,\dots,n
    在时刻 11 征服一个起始城市,之后每个时刻必须征服一个与已征服区域相邻的城市。
    对每个城市 ii,必须在其截止时间 aia_i 之前(含 aia_i)征服它。
    aia_i11nn 之间的整数。

    对于给定的数组 aa,定义“好的起始城市”为:存在一种征服顺序(策略)满足所有 aia_i 约束。
    要求:对每个 k=0,1,,nk=0,1,\dots,n,计算有多少个数组 aa 使得好的起始城市个数恰好为 kk
    答案对给定质数 pp 取模。


    关键结论(Lemma)

    Lemma 1

    对于固定起始城市,若存在获胜策略,则以下贪心策略必胜:

    • 如果存在某个右侧城市,其距离为 tt 且截止时间恰好为 tt(即 aj=距离a_j = \text{距离}),则向右走;
    • 否则向左走。

    推论:若存在获胜策略,则以下双向贪心也必胜:

    • 若某方向存在 aj=距离a_j = \text{距离} 的城市,则往该方向走;
    • 否则任意方向。

    Lemma 2

    好的起始城市集合要么为空,要么是一个连续区间

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

    lrl \le r 时区间非空,此时区间内所有城市都是好的起始城市。

    证明思路:

    • x<lx < l,则存在某个 ii 使得 iai+1>xi-a_i+1 > x,即 ii 距离 xx 超过 ai1a_i-1,不可达。
    • x[l,r]x \in [l,r],用双向贪心先征服 II 内所有城市(时间 rl+1\le r-l+1),再征服外部,不违反截止时间。

    因此,好的起始城市个数 = rl+1r-l+1


    从区间 [l,r][l,r] 到数组 aa 的约束

    I=[l,r]I = [l,r] 可得:

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

    因为 iill 的距离为 il+1i-l+1,到 rr 的距离为 ri+1r-i+1,必须在这两个时间内征服 ii

    另外,在贪心策略 1 下,访问顺序完全确定

    • aj=jl+1a_j = j-l+1jj 是当前区间右端,则必须向右扩展;
    • 否则向左扩展。

    这个贪心会产生唯一的访问顺序(对固定 l,rl,r 和固定起始点)。


    动态规划设计(标程思路)

    状态定义

    dp[i][j][0/1]dp[i][j][0/1] 表示:
    当前已征服的区间是 [i,j][i,j]
    k=0k=0 表示上一步是从 ii 向左扩展来的(当前准备向右扩展),
    k=1k=1 表示上一步是从 jj 向右扩展来的(当前准备向左扩展)。

    但标程更常用的是 f[i][j]f[i][j] 表示区间 [i,j][i,j] 作为 II 时的方案数。


    转移

    情况 1:从 [i+1,j][i+1,j] 扩展到 [i,j][i,j]
    这要求 aiji+1a_i \ge j-i+1(因为 ii 在时刻 ji+1j-i+1 被征服)
    还要满足 aiil+1a_i \ge i-l+1airi+1a_i \ge r-i+1,但 l,rl,r 固定,所以是:

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

    并且此步只能是向左扩展,所以前一步 dp[i+1][j]dp[i+1][j]kk 必须为 11(或标程里用方向标识)。

    情况 2:从 [i,j1][i,j-1] 扩展到 [i,j][i,j]
    要求 aj=ji+1a_j = j-i+1(否则贪心不会向右扩展)
    并且 aja_j 必须 jl+1\ge j-l+1rj+1\ge r-j+1,所以:

    ji+1max(jl+1,  rj+1)j-i+1 \ge \max(j-l+1,\; r-j+1)

    这个不等式自动满足当 [l,r][l,r]jjji+1j-i+1 足够大。


    初始状态

    区间长度为 1 时,dp[i][i]=1dp[i][i] = 1(只有一种访问顺序)。


    统计恰好 kk 个好的起始城市

    第一步:统计 I=[l,r]I=[l,r] 为好的起始城市集合的方案数

    ans[l][r]ans[l][r] 表示 I=[l,r]I=[l,r] 时的数组个数(此时好的起始城市个数为 rl+1r-l+1)。

    由 DP 可算出 ans[l][r]ans[l][r]

    第二步:容斥得到“恰好 I=[l,r]I=[l,r]

    [l,r][l,r] 是好的起始城市集合,则必须 [l,r][l,r] 为满足约束的最大区间。
    即:

    • 不能有 l1l-1 也是好的起始城市(否则 II 更大)
    • 不能有 r+1r+1 也是好的起始城市

    这等价于:

    al1<(l1)l+1=0a_{l-1} < (l-1)-l+1 = 0

    不可能,所以 ll 必须是 minI\min I 自然满足。

    更精确的容斥:

    $$\text{exact}[l][r] = ans[l][r] - ans[l-1][r] - ans[l][r+1] + ans[l-1][r+1] $$

    其中 ans[l][r]ans[l][r] 表示 [l,r][l,r] 是好的起始城市集合的子集的方案数(即所有 [l,r][l,r][l',r'] \supseteq [l,r] 的方案数)。

    由 DP 可直接得到 ans[l][r]ans[l][r]


    复杂度优化

    直接对每个 [l,r][l,r] 做 DP 是 O(n4)O(n^4)
    标程优化到 O(n2)O(n^2)

    • 固定 rr,动态处理 ll
    • 注意到 aiil+1a_i \ge i-l+1airi+1a_i \ge r-i+1ll 变化时只有 il+1i-l+1 变化
    • 用前缀和或差分来快速更新 DP 状态
    • 最终 O(n2)O(n^2) 求出所有 ans[l][r]ans[l][r]

    答案输出

    • k1k \ge 1,答案 =rl+1=kexact[l][r]= \sum_{r-l+1 = k} \text{exact}[l][r]
    • k=0k = 0,答案 =nnk1ansk= n^n - \sum_{k \ge 1} \text{ans}_k

    pp 计算即可。


    示例验证(n=3)

    已知输出:

    k=0: 14
    k=1: 7
    k=2: 4
    k=3: 2
    

    检查:

    • k=3k=3 对应 I=[1,3]I=[1,3]aiia_i \ge i,只有 [3,2,3],[3,3,3][3,2,3],[3,3,3] 等,共 2 个 ✓
    • k=2k=2 对应 I=[1,2]I=[1,2][2,3][2,3],分别统计 ✓

    总结核心公式

    1. 好起始城市集合 = 连续区间 [l,r][l,r]
    2. 约束aimax(il+1,  ri+1)a_i \ge \max(i-l+1,\; r-i+1)
    3. 贪心访问顺序唯一确定
    4. DP 状态dp[i][j]dp[i][j] 表示区间 [i,j][i,j] 被征服的方案数
    5. 转移:向左或向右扩展,注意截止时间必须恰好等于扩展步数(向右时)
    6. 容斥:$exact[l][r] = dp[l][r] - dp[l-1][r] - dp[l][r+1] + dp[l-1][r+1]$
    7. 复杂度O(n2)O(n^2)

    这样即可在 O(n2)O(n^2) 内求解所有 kk 的答案。

    • 1

    信息

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