codeforces 记录
Codeforces Global Round 30 (Div. 1 + Div. 2)
A. Sequence Game
如果 \(mn\le x\le mx\) 则可行,否则不可行。
证明:如果 \(x>mx\) 或 \(x<mn\) 显然不可行,否则可以从 \(mn\) 往外扩展,全部选择改成 \(mn\),\(mx\) 同理。最后剩下 \(mn\) 和 \(mx\),直接选择位于其中间的 \(x\) 即可。
B. Even Modulo Pair
直接暴力枚举元素对,找到答案就 break。下面证明复杂度正确:
我们只需要证明随便选 \(n\log V\) 个对,一定可以找到答案,分为三种情况讨论:
- 数组全为奇数:如果 \(a_{i+1}\bmod a_i\) 是奇数,且 \(a_{i+1}<2a_i\),那么 \(a_{i+1}\bmod a_i=a_{i+1}-a_{i}\),其为偶数,此时我们找到了答案;否则,每次元素变大一倍,最多变大 \(\log V\) 倍。所以 \(n\log V\) 对一定找得到答案。
- 数组包含一个偶数,那么这个偶数不会带来太大影响。
- 数组包含两个偶数,那么在枚举到其中一个偶数时,必定会枚举到第二个偶数,而偶数对偶数取模一定是偶数,此时依旧找到答案。
综上,时间复杂度 \(\mathcal O(n\log V)\)。
C. Dungeon
显然 \(c_i=0\) 的怪物一定最后打,因为它不会带来任何的好处。
因为剑的伤害永远不会变低,所以我们把 \(c_i>0\) 的怪物按血量从小到大排序,用能打败这只怪物的伤害最低的剑攻击。最后尝试攻击 \(c_i=0\) 的怪物即可。
证明一下做法正确。如果不用伤害最低的剑攻击(设其伤害为 \(a\)),改用另一把伤害为 \(b\) 的剑攻击,那么之前会剩下伤害分别为 \(\max (a,c_i)\) 和 \(b\) 的两把剑,改变之后就成了 \(a\) 和 \(\max(b,c_i)\) 两把。显然后者更劣。
直接优先队列维护之,复杂度 \(\mathcal O(n\log n)\)。
D. Copy String
枚举最小变化轮数 \(k\),最初字符串 \(s\) 中的每一个字符 \(s_i\) 一定对应着 \(t\) 中的一段区间 \([l_i,r_i]\),其中 \(t_l\sim t_r\) 均为 \(s_i\),且 \(r_i-i<k\)。
用这个判断轮次 \(k\) 是否可行即可,每个字符贪心地取最大的 \(r_i\) 即可。
对于构造,第 \(k\) 轮时,枚举字符 \(c_i\),如果其对应的 \(r_i>i\),那么该轮中位置 \(i+1\) 的字符一定为 \(c_i\),否则下一轮的没有被要求的字符只要保持不变即可。
时间复杂度 \(\mathcal O(nk_{\max} )\)。
E. Journey
首先拍照的代价一定不能被抹除,如果该图有欧拉回路,那么一定不需要坐火车。那么我们要做的就是通过火车在两个度数为奇数的点中加入一条虚边,使得新图存在欧拉回路。
由于该题定义代价的方式比较古怪,最密切相关的其实是边的编号。于是想到类似 kruskal 重构树地,按 \(1\sim m\) 的顺序加入每一条边,并建立原图的重构树。
这样,根据重构树的建立方式,能够知道从 \(u\) 到 \(v\) 能够经过的边中,编号最大的一条边的深度一定不深于 \(\operatorname{lca}(u,v)\) 的深度。于是我们可以预处理出每一个代表一条边的节点,走编号比这条边大的边,能走到的最小权值 \(val\) 是什么。具体地,如果 \(u\) 和 \(v\) 的代表元 \(x,y\) 是同一个,那么 \(val_x\gets \min(val_x,w_i)\)。最后 dfs 一遍重构树,把每个 \(val_u\) 设为 \(\min(val_u,val_{fa})\) 即可。
最后我们能发现,从根节点到叶子节点,\(val\) 是单调不增的,所以如该子树内有两个节点可以配对,那么一定尽可能地进行配对。直接在重构树上 dfs 即可。
时间复杂度 \(\mathcal O(n\alpha(n))\)。
Codeforces Round 1063 (Div. 2)
A. Souvlaki VS. Kalamaki
把 \(a\) 数组从小到大排序,判断所有后手能操作的位置元素是否相同即可。
B. Siga ta Kymata
显然最大值、最小值、\(1\)、\(n\) 这四个点永远不可能被覆盖。
否则,我们可以用令最小值位置为 \(x\),最大值位置为 \(y\),我们可以用进行 \((1,x),(1,y),(x,n),(y,n),(\min(x,y),\max(x,y))\) \(5\) 次操作覆盖所有除了上述位置的位置。
C. Monopati
对于每个 \(l\),求出满足题意的最小的 \(r\),显然可以双指针,考虑如何添加和删除元素即可。
设只走第一行能到达的最大位置为 \(p_1\),第二行能到达的最位置为 \(p_2\),若 \(p_1\ge p_2\),显然能走到。
那么用两个 set 分别维护第一行和第二行最小的空缺位置,\(p_1\) 就是 set 中最小元素减一,\(p_2\) 就是 set 中最大元素加一。
D1/D2. Diadrash
结论:设全集为 \(U\),且 \(U\) 中元素在序列中仅出现一遍,那么 \(\operatorname{mex}(S)=\min(U\setminus S)\)。
所以一个区间的 mex 就是其前后缀的最小值的最小值。注意到前缀最小值单调不升,后缀最小值单调不降,所以其形成的 mex 形如一个单峰函数。
先把包含的区间去掉,剩下的区间最多有 \(n\) 个,并且左右端点单调递增。我们只需要二分找出最后一个前缀最小值大于后缀最小值的区间,设其为 \(x\),那么答案不是从 \(x\) 号区间得到的,就是从 \(x+1\) 号区间得到的。前缀最小值和后缀最小值可以转化为补集 mex 来确定,一次二分需要用两次询问,确定答案需要两次,总操作次数为 \(2\lfloor\log_2n\rfloor+2\),正好卡满 \(30\) 次。
E. Plegma
脑电波,注意到我们只需要通过矩阵发送一个字符 \(C\) 即可。
如果图联通,我们就找行的最大字典序和列的最小字典序,反之则找行的最小字典序和列的最大字典序。判断联通就判断给定的两个字符串是否有 \(s\ge t\) 即可。
至于为何不存在行的字典序都小于列的字典序,并且 \(C=1\) 之类的,证明待补。

浙公网安备 33010602011771号