1 条题解
-
0
题解
思路
先建立按“已染红的
1数量”划分的二次动态规划,再利用它的离散凹性,仅维护相邻状态的有序差分斜率。做法
先假设所有位置都染成蓝色,基础收益为 ,并令 。把第 位改成红色会增加 ,但每一对同时染红的
1...0还要扣除 。子任务 1:枚举染色
当 时,枚举 种红蓝方案。扫描字符串时维护此前染红的
1数量;遇到染红的0时减去该数量。子任务 2:按染红的
1数量动态规划设 表示处理完当前前缀、其中恰有 个
1被染红时的最大收益,初始 。- 遇到
1:选择蓝色时状态不变;选择红色时状态由 转移到 ,并增加 ; - 遇到
0:若此前有 个红色1,把该位染红的额外收益为 ,所以给 增加 。
满分算法:维护 DP 的差分斜率
上述 关于 是离散凹函数。记相邻差分为
这些差分按非增顺序排列。只需保留正差分,因为最终要求所有状态的最大值,而非正差分以后只会继续减小。
遇到
1时,转移相当于向差分多重集合中插入 ;若 可直接丢弃。遇到
0且 时,函数 使 增加 ,并使最大的前 个差分各减 。实际差分数不超过1的数量,所以只处理前 个。用按差分值排序的随机 Treap 维护每个值的出现次数、子树总次数、子树值之和与整棵子树的懒加标记。按出现次数拆出最大的若干差分,对整棵子树打 标记,再合并边界相等值并删除降到零的差分。
最后答案为蓝色基础收益、所有
0对 的增量以及正差分总和之和。复杂度
暴力枚举为 ;中层动态规划为 、空间 ;满分算法为 、空间 。多组数据时把 替换为所有测试用例长度之和。
正确性证明
二次 DP 逐位置穷尽当前位置的两种颜色,因此状态含义成立。其差分始终非增:
1的转移是与一个两点函数做最大加卷积,相当于有序插入一个新差分;0的转移给前若干差分统一减一,仍保持凹性。Treap 完整模拟这两种差分变化,因此维护的函数始终与二次 DP 相同。最终取最大状态等于从 出发累加全部正差分,故算法输出最优收益。 - 遇到
- 1
信息
- ID
- 1421
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者