Codeforces Round 890 (Div. 2) supported by Constructor Institute
1|0Preface
现在开始严格按照双号上分法来打CF了,大致就是每次比赛都拿两个号中分较少的那个打,这样可以保证两个号的最高分不降
然后昨天打完就后悔了,没有拿hl666那个号打导致没抓住难得的上分机会,本来可以打到橙名渡劫局的但分全加在Kusanagi_Misuzu那个号上了
不过昨天这场其实可以打的更好的,前面被C搞了导致后面时间不够宽裕了,最后写完E1还有25min其实完全可以搏一搏E2的,但就是下意识地以为自己写不来就没想了
后面一看题解妈的就是我前两天和ztc说的多重背包在总体积较小时的优化,血妈亏
2|0A. Tales of a Sort
签到题,不难发现如果,则我们只要要操作次来把这两个数都变成,因此取最大值输出即可
3|0B. Good Arrays
刚开始秒出了一个假算法WA了一发,后面冷静下来才发现我是傻逼
首先特判时无解,否则我们不妨令原序列所有的位置都有,而的位置都有
做完之后求出和比较下即可,对于多出的部分我们总可以调整使得序列仍然满足要求
4|0C. To Become Max
这题就是很容易想一些假算法,刚开始写了个样例都过不去,后面重新想了下才过
考虑枚举最后最大值出现的位置,刚开始想着是模拟加数的过程,但十分难写
后面发现其实大可以二分最后变成的值,然后转化成判定性问题后就很好办了
假设当前变成的最大值为,则最后这一段数一定形如,只要中间存在某个位置大于等于目标值既可以中止了
注意特判处理到最后一个数的情况,具体实现可以看代码,复杂度
5|0D. More Wrong
比赛时过的人不多但我感觉是个很一眼的题
首先考虑一种保证正确性的做法,假设我们已经知道了中最大值的位置
那么考虑加入后最大值无非两种情况,保留或者变成
而我们只需要比较的逆序对数量是否和的逆序对数量相同即可
若相同则说明比中的所有数都大,自然是的最大值,否则则说明中有至少一个数大于,则说明最大值仍为
然后要优化的话是显然的,我们用分治法每次先递归求出子区间的最大值位置,再合并即可
稍微列出最坏情况下的式子的代价算一下可以得到:
符合题目要求
6|0E1. PermuTree (easy version)
首先有个很显然的性质就是每个子树内的数一定是一段连续的区间,正确性显然
因此我们考虑统计某个点的答案时,只要将它的子树划分为两类,一类是最后填的数小于它本身的,一类是大于它本身的,不难发现两类集合的大小之积就是贡献
那么问题其实可以转化为一个0/1背包问题,直接暴力做就可以通过E1了
7|0E2. PermuTree (hard version)
曾记得某天ztc问过我和这个一模一样的东西,当时我秒出了做法但现在我TMD的想都懒得想了可海星
考虑这个0/1背包的一大特点就是总体积和也是级别的,利用类似于根号分治的思想我们知道不同类的物品的个数很少
因此可以把它转化成多重背包来做,为了优化可以再加一个二进制分组上去,当然再极限一点的话再套个bitset
也不是不行
同时有一个很有用的剪枝就是当存在某个子树的大小大于其它所有子树大小之和时可以直接计算贡献,实测发现这个剪枝非常有效
总复杂度不太好写表达式,总之大概跑1s左右
8|0Postscript
现在两个号都是2000+了,感觉有望趁状态好冲一波橙名了
__EOF__

本文链接:https://www.cnblogs.com/cjjsb/p/17610170.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】
2018-08-06 【LGR-049】洛谷7月月赛