1 条题解
-
0
题目重述
有 个城市排成一行,编号 。
在时刻 征服一个起始城市,之后每个时刻必须征服一个与已征服区域相邻的城市。
对每个城市 ,必须在其截止时间 之前(含 )征服它。
是 到 之间的整数。对于给定的数组 ,定义“好的起始城市”为:存在一种征服顺序(策略)满足所有 约束。
要求:对每个 ,计算有多少个数组 使得好的起始城市个数恰好为 。
答案对给定质数 取模。
关键结论(Lemma)
Lemma 1
对于固定起始城市,若存在获胜策略,则以下贪心策略必胜:
- 如果存在某个右侧城市,其距离为 且截止时间恰好为 (即 ),则向右走;
- 否则向左走。
推论:若存在获胜策略,则以下双向贪心也必胜:
- 若某方向存在 的城市,则往该方向走;
- 否则任意方向。
Lemma 2
好的起始城市集合要么为空,要么是一个连续区间
$$I = \bigcap_{i=1}^n [\,i-a_i+1,\; i+a_i-1\,] = [l, r] $$且 时区间非空,此时区间内所有城市都是好的起始城市。
证明思路:
- 若 ,则存在某个 使得 ,即 距离 超过 ,不可达。
- 若 ,用双向贪心先征服 内所有城市(时间 ),再征服外部,不违反截止时间。
因此,好的起始城市个数 = 。
从区间 到数组 的约束
由 可得:
因为 到 的距离为 ,到 的距离为 ,必须在这两个时间内征服 。
另外,在贪心策略 1 下,访问顺序完全确定:
- 若 且 是当前区间右端,则必须向右扩展;
- 否则向左扩展。
这个贪心会产生唯一的访问顺序(对固定 和固定起始点)。
动态规划设计(标程思路)
状态定义
设 表示:
当前已征服的区间是 ,
表示上一步是从 向左扩展来的(当前准备向右扩展),
表示上一步是从 向右扩展来的(当前准备向左扩展)。但标程更常用的是 表示区间 作为 时的方案数。
转移
情况 1:从 扩展到
这要求 (因为 在时刻 被征服)
还要满足 和 ,但 固定,所以是:并且此步只能是向左扩展,所以前一步 的 必须为 (或标程里用方向标识)。
情况 2:从 扩展到
要求 (否则贪心不会向右扩展)
并且 必须 和 ,所以:这个不等式自动满足当 含 且 足够大。
初始状态
区间长度为 1 时,(只有一种访问顺序)。
统计恰好 个好的起始城市
第一步:统计 为好的起始城市集合的方案数
设 表示 时的数组个数(此时好的起始城市个数为 )。
由 DP 可算出 。
第二步:容斥得到“恰好 ”
若 是好的起始城市集合,则必须 为满足约束的最大区间。
即:- 不能有 也是好的起始城市(否则 更大)
- 不能有 也是好的起始城市
这等价于:
不可能,所以 必须是 自然满足。
更精确的容斥:
$$\text{exact}[l][r] = ans[l][r] - ans[l-1][r] - ans[l][r+1] + ans[l-1][r+1] $$其中 表示 是好的起始城市集合的子集的方案数(即所有 的方案数)。
由 DP 可直接得到 。
复杂度优化
直接对每个 做 DP 是 。
标程优化到 :- 固定 ,动态处理
- 注意到 和 在 变化时只有 变化
- 用前缀和或差分来快速更新 DP 状态
- 最终 求出所有
答案输出
- 对 ,答案
- 对 ,答案
模 计算即可。
示例验证(n=3)
已知输出:
k=0: 14 k=1: 7 k=2: 4 k=3: 2检查:
- 对应 ,,只有 等,共 2 个 ✓
- 对应 或 ,分别统计 ✓
总结核心公式
- 好起始城市集合 = 连续区间
- 约束:
- 贪心访问顺序唯一确定
- DP 状态: 表示区间 被征服的方案数
- 转移:向左或向右扩展,注意截止时间必须恰好等于扩展步数(向右时)
- 容斥:$exact[l][r] = dp[l][r] - dp[l-1][r] - dp[l][r+1] + dp[l-1][r+1]$
- 复杂度:
这样即可在 内求解所有 的答案。
- 1
信息
- ID
- 6295
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者