ARC150F Constant Sum Subsequence 解题记录

题意:

给定长度为 n 的序列 A,保证对每个 i[1,S]i 都在 A 中出现了至少一次。

X 表示 A 重复 S 次组成的序列。

求最小的 L,满足:

对每个和为 S 的序列 BB 都是 (X 的前 L 个元素组成的序列) 的子序列。

n1.5×106,S2×105


考虑一个朴素的 dp。

dpi 表示:X 的前 i 个元素组成的序列,可以包含所有的和不大于 dpi 的序列。

易知有这样的转移:

维护一个辅助数组 g,其中 gi 表示结尾为 i 的序列此时的答案。
枚举每个 i[1,n×S],令:

dpi=minj=1SgjgXi=max(gXi,dpi1+Xi)

采用适当的维护方法,就可做到复杂度 O(n×S)


仔细分析可知 dpi 只有 O(SlogS) 个不同的取值。

这引导我们得到和 dpi 取值强相关的做法。

我们考虑对 dpi 相同的一段进行快速转移。

维护 L,表示此时只考虑 i<Ldpi 转移。
接下来从小到大对最小的一些 gi 一次性更新这些:

gi=dp+i

如果此时 gi 没有发生变化,就更新 L,并令 gigi+i

仔细分析,可知每当 gi 更新两次,gi 至少变大 i

总复杂度 O(Slog2(n+S)),可以通过此题。

posted @   一般通过小萌新  阅读(119)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示