CF div2 1005 (A~D)
A
每次将当前
B
容易发现分数一定不会增加,只能尽可能保持不变。而题中还要在在分数最大情况下最小化数组长度,可以发现:只能删掉出现次数为
C
一眼题。发现选择的任意正数一定在任意负数左侧,则相当于挑选一个左侧全是正数,右侧全是负数的最优子序列。
前缀和分别处理正数和负数,枚举分界位置即可。
D
字典树
题目相当于给点
首先,通过二进制形式来判断
- 对于任意
, 与 的第 位均相同。
可以发现这个信息与 相同前缀 是密切相关的,因此可以考虑字典树来维护。这里字典树维护的信息描述起来可能不是很好懂:
- 字典树上的某个结点
对应一个前缀 ,同时具有一个权值 ,表示 的前缀为 时,原序列中的哪个位置开始出现 ,也就是从 的末位(假设是第 位)开始出现 ,并且 。
令
- 若
与 (第 个二进制位上的数字)相同,则需要继续看后面的二进制位 -> 在字典树中等价于开一个新点并将指针移向这个新点。 - 若不同,则当
时,找到了一个符合要求的位置,需要做记录 -> 在字典树中体现为:在对应前缀的结点上记录该位置(若原来有位置,则取最大值,因为要找最先不合法的位置;并且以后再碰到有记录的点就也可以不用再继续看了);而当 时,就不需要看后面的二进制位了,因为一定能保证 -> 在字典树中等价于什么都不做。(目的是找到所有满足上述条件的位置并在相应前缀上做记录,发现后续不可能再满足上述条件就不需要再开点继续向低位看了)
将所有
对于任意询问
还有一个比字典树更好且更易理解的做法,是b站up主yvbf的做法,听完讲解后大彻大悟,感觉是非常好的方法。这里直接贴代码和讲解视频链接,不写题解了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战