1 条题解
-
0
1. 问题理解
我们有一个长度为 的内存,初始全 。
目标状态由 游程编码(Run-Length Encoding, RLE) 给出:
个 ,接着 个 ,…, 个 。
总长度 。
允许的操作:
,其中 必须是 正确的内存段,即长度 ,且 是 的倍数。
要求:最少操作次数。
2. 正确内存段的性质
正确内存段其实就是 完全二叉树上的节点对应的区间。
整棵树根节点:(长度 )。
每个节点 的长度是 , 是 的倍数。
它可以分成两个子节点: 和 ,其中 (长度 )。
3. 思路
初始全 ,目标状态是给定的 RLE 序列。
操作是覆盖一个正确内存段为同一个值 。
我们要用最少的覆盖操作得到目标状态。
3.1 从目标倒推(贪心合并) 一个常见思路:从目标状态出发,考虑如果两个相邻块的值相同,并且它们可以合并成一个 正确的内存段,那么我们可以用一次操作覆盖它们,而不是两次。
但这里要注意:我们可能先覆盖大的区间,再覆盖小的区间来修正,但这样可能不是最优。 实际上,我们可以用 自底向上 的树形 DP 来考虑。
4. 树形 DP 模型
把整个内存 看作一个满二叉树的根。
定义 表示:把以节点 (对应某个正确内存段)变成目标状态中该段的值所需的最少操作次数。
如果 是叶子(长度 1),那么如果目标值等于初始值 0,则 ,否则 。
如果 是非叶子,它有两个孩子 和 。
设 表示目标状态中这个段是否 整个段都是同一个值(即该段在目标状态中所有单元值相同)。
如果 存在(设为 ),那么我们可以用一次操作 覆盖整个段,然后不需要在子树里再操作,所以 。
否则,我们必须分别处理左右孩子:。
但是注意:如果左右孩子的目标值相同,并且这个值和用一次操作覆盖 的值相同,我们可能可以节省一次? 其实这里要小心:如果 且不为空,那么 就应该等于这个值,所以这种情况已经被 存在的情况覆盖了。 所以不需要额外判断。
关键: 怎么求? 我们预先知道整个目标数组(通过 RLE 展开?但 最大 30, 太大不能显式展开)。 所以必须 不显式展开数组 而判断某个正确段是否在目标状态中值全相同。
5. 不显式展开判断段的值一致性
一个正确段 的长度是 。
我们有一个 RLE 序列 。
我们可以通过 前缀和 快速定位 和 所在的 RLE 块。
如果 完全包含在某个 RLE 块内,那么 。
否则, 不存在(即该段内目标值不统一)。
判断方法:
设 表示第 个 RLE 块的结束位置(0-indexed 的右端点),即 , ,… 。
对于区间 :
找到 所在的 RLE 块 ,使得 (注意边界)。
找到 所在的 RLE 块 。
如果 ,那么整个区间在同一个 RLE 块,值相同 。
否则,如果 ,还要检查 是否在 块末尾, 是否在 块开头,并且 吗? 其实更简单:只要 跨过 RLE 块边界,并且这些块的值不全相同,那么 就不存在。 但注意:如果 覆盖了多个块,但这些块的值都一样,那么 存在。
所以准确条件:
存在,当且仅当 包含的所有 RLE 块的值都相同。
6. 算法步骤
预处理 RLE 块的前缀和 ,,。
构建一个递归函数 计算 和 对于正确段 。
长度 。
用前缀和找到 覆盖的 RLE 块:
设 = 最小的 使得 ,其实更准确: 块 对应区间 。 我们找 在哪个块:二分查找最小的 使得 ,则 。 同样找 在哪个块:最小的 使得 ,则 。
如果 ,则 。
否则,检查 是否全相同,如果是,,否则 。
如果 存在,则 。
否则,, 。
返回 。
7. 复杂度
递归深度 。
在每一段判断值一致性时,最坏需要遍历 个 RLE 块? 但这里可以优化:我们预先记录 RLE 中值变化的边界,用区间最小值/最大值查询(Segtree 或 Sparse Table)在 判断一个段内的 是否全相同。 具体:对 RLE 序列 ,我们想查询 的最小值 和最大值 ,如果 则全相同。
预处理 ,每个节点判断 ,总节点数 但 太大? 不对,正确内存段的总数是多少? 长度为 的段有 个,,所以总数为 。 当 ,节点数约 太大,不能显式递归所有节点。
8. 优化:只递归必要的节点
很多节点的 可能直接存在,不需要递归到叶子。
我们可以在递归时,如果发现当前段 在目标状态中值全相同,就直接返回 1,不递归子节点。
这样,递归只会沿着 值变化的边界 进行,节点数最多 ? 因为每个 RLE 块边界会生成 个递归节点。
这样可行。
9. 总结
我们利用 正确内存段 = 满二叉树的节点 这一结构,采用分治 + 记忆化搜索, 仅递归那些在目标状态中值不一致的段,利用 RLE 和 ST 表快速判断段内值一致性, 从而在 时间内解决问题。
最终答案 = 递归计算 的结果。
- 1
信息
- ID
- 4122
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者