Codeforces练习笔记2
CF1051G Distinctification
不难发现,对于一个联通块内的点,显然是\(b\)权值越大的在越前,而且整体而言能向前则向前
对于一个点加入到一个联通块中,只要查询联通块内有几个点的权值大于(小于)它,对应的加加减减即可
问题是加入一个点时可能联通两个联通块,这就很痛苦了。
这种块块的合并多数使用线段树合并进行维护,有点类似于\(PKUWC\)的\(minnimax\),通过线段树合并维护\(dp\)数组
CF1500C Matrix Sorting
注意原序列似乎没有任何性质,最多判个\(-1\),末序列的的性质显然要多很多
最直观的,最后如果有一列是单调不减的,那么显然最后一次操作必然是这一列,若有多列,可以发现是等价的
然后继续倒推一次,倒数第二操作的列在单调递增的列按照权值分段后,每一段也是单调不减的。
发现这样一直倒推就可以推出来可能的操作序列。
然后正序模拟一次,在\(check\)一发,就可以判断了,而且也符合操作数的限制
CF1238G Adilbek and the Watering System
显然要尽可能的叫便宜的朋友带水,于是先按照b进行排序
然后枚举朋友,可以通过数据结构维护当前这一时间的水量有多少和在不多余的情况下最多加多少水。
然后尽可能多买水即可
CF1455F String and Operations
第一反应就是设一个\(string\)类型的\(dp\)数组,这样处理转移非常方便。
由于存在R操作,会对后续dp时加入字符的权值进行修改,这使得dp较难进行
所以不妨把这些东西记录到\(dp\)数组内,\(dp[i][0/1]\)表示处理到i,最后一次操作是否为R所能得到的最小字典序的字符串
这样就处理了改变后续字符的问题。
CF1452F Divide Powers
不妨先考虑一下拆数贪心策略。
对于一个不大于\(2^x\)的数,每次拆数会使不大于\(2^x\)的数的个数增加\(1\),这显然一种平凡情况
对于一个大于\(2^x\)的数,设之为\(2^k\),将其分解为\(2^{k-x}\)个\(2^x\)的数需要\(2^{k-x}-1\)次操作,显然比上一部分要更加优秀
同时,如果不完全分解,则不优于第一种操作。
然后程序的大致流程就出来了。
先进行第二种操作在不超过个数的情况下尽可能多的完全分解数。
如果此时仅进行操作一即可完成,则进行操作一。
否则第二种操作部分分解使得可以只进行操作1完成,这可以直接倒推得到。
CF1411F The Thorny Path
首先有个基本结论:%%chasedeath
没想到有一天会在自己的博客里安利别人的博客
然后考虑分配过程:
对于\(n\equiv 0 (mod 3)\),对于原有的置换环,12优先配对,剩下自己配
对于\(n\equiv 1(mod 3)\),先取出2(由2环或者2个1环得到)剩下进行上一步操作
对于\(n\equiv 2(mod 3)\),同样先特判4或者2个2,剩下按照第一步处理
羡慕人家扎实的数学功底
CF1250I Show Must Go On
见博主的另一篇博文
CF1214H Tiles Placement
对于不存在答案的情况,显然是存在一个分叉导致岔路的3个(或以上)支路无法和谐的染色方案
然后可以拓展结论:若树的直径大于等于\(k\),且不为链,则必无解。
证明:由于直径上有分支,分别考虑该分支在直径两侧的限制不难发现必然矛盾
对于链的情况显然很好构造,对于直径小于\(k\)的情况,相当于没有限制
CF1494F Delete The Edges
首先不考虑\(shift\)操作,显然原图有解当且仅当原图存在欧拉通路。
于是现在考虑\(shift\)操作后的有解的图的特征,这里仅不考虑存在欧拉通路的图。
首先,这个图中不存在环。若存在环,则在遍历是必然会增添不联通的块,除非存在欧拉通路
设此时第一步走的边为\(u->v\),则在之后的遍历中必然要回到\(u\)或\(v\)来删除这条边
由于\(v\)再走一步的边会被删除,所以回到\(v\)的路径必然是个环,不合法。
所以\(v\)只能回到\(u\),但是如果不直接回到u,这样又需要环才能实现,也不合法。
所以\(v\)只能直接返回\(u\)。
该策略只能解决菊花图
然后问题就简单了:给定一个图,查询其能否视为一个菊花图,和一个欧拉通路的一个端点为菊花图中心的图的结合。
显然全图的核心在与菊花图中心,考虑枚举。
由于欧拉通路的一端为菊花图中心,所以菊花图的"叶子"不能存在于欧拉通路的子图中。
同时核心的非"菊花图叶子"分支不可能由shift操作后的路径解决,必然存在于欧拉通路的子图中。
有了这些结论,代码就比较好写了
CF1063E Lasers and Mirrors
这也能是个构造环的题?!没想到镜子是单面镜
先特判掉不需要镜子的情况。
注意到对于\(A_i=j\),我们可以在i,j分别放一面镜子使其到达,但是相应的会影响\(j\)的到达情况.
设\(B_i\)为\(i\)号发射器对应的镜子的行数,\(i\)不会对\(A_i\)造成影响当且仅当\(B_i\)>\(B_{A_i}\)
建立图的模型,将\(i\)向\(A_i\)连一条边,得到的图就是每个点都有一条出边,每个点都有一条入边的多个简单环
显然仅靠环内的点不可能满足整个环,而且只要抛弃一个点就可以满足整个环。
最后,还注意到抛弃的点可以重复使用。
CF1495F Squares
见博主的另一篇博文
CF1120F Secret Letters
若一个人选择了存信,那么当另一个人寄信时必然选择存信。
证明:一旦R处有信时,之后R处始终有信(只不过是交换了两人的信而已)
每一封信都会经过一些"转手",到达\(t_{n+1}\)。
构建模型后其实就是一颗树,贡献就是树边的权值和,"转手"操作实际上是使树边提前合并,使得可以减少一些树边的贡献,这个操作至少是不劣的
于是可以构建出树,注意到每颗子树向上传递的只有一封信,使得状态数非常少
同时注意到这颗树还按照奇偶分层,分别对应两个人,树形\(dp\)就很好写了
CF1442E Black, White and Grey Tree
重要的思考方向:将对树的操作转为对直径的操作
先不考虑灰色点。
对于联通的相同颜色点,显然可以一起操作,所以我们先将原树缩点。
原树缩点后成了一颗黑白点相间的树。
对于其直径,其最优的删除的方式之一为从直径两端取相同颜色的点进行删除。
再删除直径时可以顺便处理掉非直径的节点。
灰色可以在任意当做黑色点和白色点,所以对答案实际并无影响,求直径时也不需要将其计入长度。

浙公网安备 33010602011771号