1 条题解
-
0
题解
\n## 思路
好数组的判定
在数组两端补 。数组是好数组当且仅当
必要性很直接:每次覆盖位置 的合法区间长度至少为 ,因此也会覆盖它的左邻或右邻。
充分性可对元素总和作强归纳。取最靠左的正数位置 ,则 。在区间 与 中至少有一个减一后仍满足全部局部不等式;否则相邻两个失败条件会互相矛盾。执行该操作后总和减小,归纳即可将数组清零。
做法
子任务 1:枚举数组
枚举全部 个数组,逐项检查局部不等式并计数。时间复杂度为 。
子任务 2:二进制自动机
当 时,每个元素只有 两种取值。用最后两个二进制值作为四个状态,逐位加入新值并检查中间位置的不等式。最后再加入两个 处理右边界。时间复杂度为 ,空间复杂度为 。
子任务 3:直接三重转移
设 表示已经生成某个前缀,最后两个元素为 的方案数。加入 时,仅当 才能转移到状态 。在开头放入两个 ,处理完原数组后再加入两个 ,最终答案是 。
直接枚举 ,时间复杂度为 ,空间复杂度为 。
子任务 4:前缀和优化
固定 后,合法的 满足
对每个固定的 ,预处理
即可在 时间求出所有合法 的贡献。每一位只需枚举 。
正确性证明
引理 1
好数组一定满足 。
证明。 任意一次使 减一的操作长度至少为 ,必然同时使某个相邻位置减一。因此位置 被覆盖的总次数不超过两个相邻位置被覆盖次数之和。
引理 2
满足全部局部不等式的非负整数数组一定是好数组。
证明。 对数组元素总和强归纳。总和很小时结论直接成立。取最靠左的正数位置 ;若操作 会破坏位置 的不等式,则有 。这又保证操作 不会破坏位置 的不等式,其余位置显然不受影响。于是总能执行一次合法操作并保持全部不等式,再应用归纳假设。
引理 3
动态规划的状态 恰好计数所有当前前缀合法且末两项为 的数组。
证明。 加入 时,唯一新得到完整左右邻居的位置是值为 的位置;转移条件 正好验证它。其余已验证位置不变,尚未验证的只有新末项。归纳成立。
定理
算法输出全部好数组的数量对 取模。
证明。 由引理 1、2,好数组与满足全部局部不等式的数组完全相同。由引理 3,动态规划逐一且不重复地计数这些数组;末尾加入两个 后两端条件也被验证,故 即所求。前缀和只改变求和方式,不改变转移。
复杂度
满分算法对每个测试用例的时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1445
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者