ARC159F
solution
神仙 dp 题。
下文认为
先考虑一个给定的序列是否能被消除的条件。
猜测一下应该是
-
序列长度是偶数
-
不存在一个数,在序列中出现超过
次,其中 是序列长度。
必要性是显然的。我们每次尽可能消出现次数最多的数,如果满足条件 2,那么当然也是可以消完的(消掉两个数后变成了子问题),所以也有充分性。
设
-
-
-
, 表示区间 是可消的。
对于第三个式子,固定
考虑如何优化转移。
打表发现转移没有什么好的性质,每次转移点变化量之和也是不太能接受的大小。
考虑使用 CDQ 分治优化转移(比较突兀哈,zyb 猜的做法,后来发现可以做)。
对于区间
这样做有很好的性质。
性质:对于所有
,可能的出现次数大于区间一半的数的种类只有 个。
对于证明,先考虑一个前置结论:
一个序列任意前后缀的出现次数大于区间长度一半的数的种类只有
个, 是序列长度。
比较容易看出,就不证了。
这样就允许我们在计算贡献的时候枚举这样的数了。
注意,这些非法的转移的贡献是负的,要先把所有
枚举左端点,然后枚举这些数,用数据结构维护贡献。
具体实现流程如下:
下面设区间长度为
先处理出来这样的数,去重。可以
设一个这样的数
枚举不合法左端点,再枚举这
最后把差分数组前缀和一遍,对应 dp 值加上贡献即可。
带上 CDQ 的
细节比较多,而且有点卡常(official solution 是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】