Codeforces Round #842 (Div. 2)
1|0Preface
唉现在这是是做稍微难点的SB题(指Div2正常场的CD难度)总是要犯病
因此Rating上不去不说,比赛的时候连EF题面都没机会看一眼
这场先是C交上去忘记本机调试的时候把数组开小了挂了一发(本地IDE不能看很大的数组,辣鸡Dev)
然后一个D思路不顺畅,交上去WA了一发后思考了好久才发现原来的判断方法的问题,虽然在结束前两分钟改出来了但是分数已经惨不忍睹了
补题的这场的EF还行的说,顺手就都写掉了(唉又回想起以前OI全盛期的时候刷Div2都是倒着往前做的,现在菜成这个狗样)
2|0A. Greatest Convex
因为,因此直接输出即可
3|0B. Quick Sort
先直接上结论,找出以开头的最长的按顺序出现的的长度,则剩下的个位置都必须被操作
证明的话很容易,首先所有在之前的数都一定要操作,然后不在这个顺序里的数也必须要被拎出来
至于操作顺序总能找到一个次数最少的,最后答案就是
4|0C. Elemental Decompress
这种C题一般想到什么思路直接冲一发基本就没问题了,我还傻愣愣地去证做法的正确性,导致写完这题排名已经1000+了
首先判断掉一些显然无解的情况,比如某个数出现了次及以上
然后考虑所有出现了两次的数,显然两个串在这对应的位置上必须要出现这个数,至于两个串里对应位置的分配对答案没有影响
那么剩下的就是只出现了一次的数了,我们不妨把它们全部扔到一个串里去,因为这些数之间肯定是能构成排列的(没有重复)
比如样例的第二个情况,在做完上面的两个操作后得到(用.
代表不确定的位置)
然后我们考虑怎么填上每个串里各自位置的空缺,以上面的例子填上第二个串的空缺为例
我们把第二个串所有没1出现过的数1 2 3 4
,依次按对应的大小顺序填到第一个串对应的数的对应位置上
比如填完后第二个串就变成4 2 3 1 5
,然后检查一下是否会出现有位置上的数大于第一个串的即可
对于第一个串的空位也是和上面一样的方法,如法炮制即可
5|0D. Lucky Permutation
首先考虑如果不是恰好一个逆序对这个限制,而是把整个序列复原有序,操作步数是多少
说到交换以及排列,很容易想到用置换环,具体地,我们把每个位置和其上的值连边,这样就可以得到若干个联通块,其中每个联通块一定是一个简单环
我们很容易发现,对于每一个简单环,需要用次操作来复原环上的所有元素(每一次交换操作恢复一个位置,最后一次操作恢复两个)
有了这个结论之后我们考虑恰好一个逆序对的条件,不难发现恰有一个逆序对的排列就是把的排列的某两个相邻的数交换下得到的
那么我们枚举,考虑交换它们两个之后带来的影响,不难发现其实就是断开原来图中的边,改连成
首先我们发现如果在原来的图中不再一个环内,那么这般操作后这两个环会合并,这样答案就是原来的答案
如果在一个环内,就要视情况讨论,如果可以使得它们所在的环分成两个小的,那么答案就是原来的答案
考虑怎么判断这种情况,我的做法是把环上的点都找出来,按顺序排成一个序列
然后找到其中要删除的两条边,这两条边把原来的环分成了两个部分
考虑新加入的边是在这两部分内部连边还是在两部分之间连边即可,具体的实现当时脑子不清实现的可能有些复杂,不过大意是这样的没问题的说
6|0E. Partial Sorting
知道思路就豁然开朗的数数题,感觉比赛的时候不写D开E可能会更好点
首先我们发现答案的上界为,因为不管是怎样的排列,我们都可以通过依次进行操作,操作,操作来使得它有序
证明也很简单,第一次执行操作后所有大于的元素一定在上了,这样在第二次执行操作后所有大于的数都会归位,然后再执行一次操作就都有序了
那么我们只要考虑统计出操作次数为的排列的个数即可统计答案了
首先是操作次数为的排列,其个数是显然的
然后是操作次数为的排列,记其个数为,我们可以用容斥的思想,先分别考虑以下两种情况:
- 前个元素已经排列好了,只用考虑后面的个元素
- 后个元素已经排列好了,只用考虑前面的个元素
但这样得到的部分会有重复,因此要减去前个元素已经排列好且后个元素已经排列好的排列数目
而且这样得到的个数是操作次数小于等于的排列个数,因此要减去
接下来考虑操作次数为的排列个数,还是和上面类似,我们直接先考虑操作次数小于的:
- 所有小于等于的元素已经在中了,此时只要先给前个元素排序,这样前个数归位后,再给后个数排序即可
- 所有大于的元素已经在中了,理由同上
然后类似的我们也要容斥掉同时满是上面两种情况的排列的个数,不妨枚举内有多少个小于等于的数来计算
当然得到的结果要减去才是操作次数等于的方案数
最后操作次数等于的方案数就直接即可,总复杂度
7|0F. Wonderful Jump
感觉很像那种经典的决策单调性优化DP的模型,但是之前是区间和乘上距离差的平方,这里改成了区间最小值一时不知所措
看了Tutorial才发现的深意所在,妙哉妙哉
考虑设表示从跳到的最小代价,考虑从转移来,首先有两个关键结论要注意到:
- 等于或,否则我们可以找到中最小值的位置,从转移到再从转移到一定可以使得答案更优
- 当满足时,一定不可能从转移到,因为此时一步步转移的代价更小
考虑第二个结论的意义所在,我们化简以下会发现此时,那么我们发现当较大的时候的移动范围就很小了
因此很容易想到根号分治,我们考虑根据和的大小情况来讨论:
- 当时,,因此可以直接暴力转移
- 当时,分为最小值和为最小值的情况讨论:
- 若为最小值,我们可以直接用单调栈来维护前面的转移点,这样的转移点不会超过个
- 若为最小值,我们可以直接暴力往前枚举,一旦遇到就停下,这样的均摊复杂度是的
关于均摊复杂度的计算其实也很简单,我们考虑每个位置和每个小于的值,每个位置向同一个值最多转移一次
比如存在,其中,那么只会向转移而不会向转移,因此复杂度均摊下来是对的
总复杂度就是
8|0Postscript
小掉了13pts,下场争取加把劲
__EOF__

本文链接:https://www.cnblogs.com/cjjsb/p/17031688.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)