1 条题解
-
0
(说在前面:这篇题解写的非常长,并且没有 code,但是个人认为可以比较好的写明思考过程,如果你追求效率,请看其他题解)
题意简述
海滩有 个连续区段,第 个区段上有 枚琥珀。已知每一道海浪的宽度相同(均为 ),且恰好向连续的 个区段各输送一枚琥珀(海浪可以任意多次使用),求可能的最大海浪宽度 。
思路分析
将问题抽象:给定非负整数序列 ,是否存在非负整数序列 ( 表示以 为起点的海浪数量),使得对于每个位置 ,
等价于用长度为 的全 区间(可重叠)去覆盖每个位置,覆盖次数恰好为 ,求最大的可行 。
我们注意到
设 ,并定义前缀和 。通过分析覆盖关系可得:
- 对于 ,有 (因为覆盖位置 的区间起点只有 )。
- 对于 (如果存在),有 。
- 对于 ,令 ,则 。
由此可以导出使得 可行的充要条件:
- (
废话,前缀当然是非递减的)。 - 若 ,则区间 内的所有 均等于 。
- (即 )。
- 对于所有 ,有 。
其中 。当 时,任何序列都可行(每道浪只覆盖一个区段),故 总是可行。
因此,我们可以从大到小枚举 (即从小到大枚举 ),利用预处理快速检查上述条件。由于 ,直接枚举所有 并 判断即可。
实现
预处理
- 前缀非递减: 表示 是否成立。
- 区间常数判断: 表示从 开始向右第一个不同于 的位置(若不存在则为 )。那么区间 内所有值相等当且仅当 且 (实际上 已保证全等)。
- 字符串哈希:用于快速比较后段 与 (其中 )。采用多项式哈希,模数 ,基数 。预处理前缀哈希 、幂 以及幂的前缀和 。
复杂度分析
- 预处理 ,枚举 最多 次,每次检查 。
- 总时间复杂度 ,空间复杂度 。
- 1
信息
- ID
- 11501
- 时间
- 1500ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者