Codeforces Round 887 (Div. 1)
1|0Preface
补一篇好久之前打的CF的博客,说实话其实B题我当时怎么想的已经忘的七七八八了
这场第一眼看A没啥思路,就先去把B这个构造写了,中间想了挺久的大概40min才写出来
然后回头一看A发现可以倒着做,就是个丁真题了然后15min写完
后面看C刚开始以为是个贪心,后面又感觉是个DP,但状态数比我预计的多,搞来搞去也没写出来
后面看Tutorial才发现原来是带悔贪心,捏麻麻的好像自从ZJOI2020那道题之后就再也没见到过这个算法的题了,苦路西
2|0A. Ntarsis' Set
正着想不太好搞(其实也能做),安利一手徐神的正序的做法——CF1852A 中的结论证明
其实不妨倒着考虑问题,我们不妨将进行了次删数操作的集合称为版本,则我们现在要求的是版本中第一小的元素
那么倒着想这个元素其实就是版本中第一个没有出现的元素,我们记此时它的位次为
那么再往前推一步这个元素其实就是版本中第个没有出现的元素,不难发现可以一路推回到版本中第几个没有出现的元素
具体实现可以直接用一个指针来单调移动,但比赛的时候我降智了写了个二分,不过无伤大雅
3|0B. Imbalanced Arrays
原谅我这题真忘了我当时怎么想的了,就说一个大概的印象吧
首先我们将从大到小排序,同时我们设数组表示对于每一个,我们都对进行区间加操作
则若则一定无解,不难发现这是充要条件
否则我们可以找到一个分界点,满足中所有数最后取值都是正的,而中所有数最后取值都是负的
由于最后数的值域是,我们不妨从到枚举每个数,然后考虑每次要么将正的这个数放在前面部分,要么将负的这个数放在后面部分
具体放在哪边的话可以把贡献的式子写出来和目标的式子对比一下,不难发现这样一定可以构造出一组合法的解
4|0C. Ina of the Mountain
首先考虑以下经典问题,给定数列,每次可以选择将一个区间内的所有数减去,求最后最少的操作次数使得所有数为
根据差分我们容易知道最后的答案其实就是,但这道题相当于是可以将每个数加上若干个,求上述式子的最小值
考虑以下贪心的想法,首先不妨设与加上的的数量相同,则此时:
- 若,则上述式子的贡献为,贪心地认为不动是最优的
- 若,则有两种情况:
- 不做其它修改,此时对答案的贡献为
- 将的所有都加上,不难发现此时对答案的贡献为
由于我们每次要求出当前的最优代价,因此考虑将对操作的这种方案视为反悔操作,用一个小根堆来维护所有反悔操作的最小贡献即可
要注意的是若我们选择在这个时候反悔选择对进行操作,那么后续反悔选择在这个位置时要额外付出的代价其实是而非,因为的值已经比原来的大了
剩下的细节看代码吧,复杂度
5|0Postscript
如果能像这样一点一点地蹭上2100就好了……
__EOF__

本文链接:https://www.cnblogs.com/cjjsb/p/17601810.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-08-02 CodeTON Round 2
2018-08-02 CF [2016-2017 ACM-ICPC CHINA-Final][GYM 101194 H] Great Cells
2018-08-02 数列分块入门九题(三):LOJ6283~6285
2018-08-02 NOIp膜你赛三 简要题解
2018-08-02 NOIp膜你赛二 简要题解
2018-08-02 NOIp膜你赛一 简要题解