Codeforces 题目选做 II
feecle6418 · · 个人记录
只做了几十道就在模拟赛 / CF 里出现了两次一样的做法,说明随机做 CF 帮助很大!!!
One-Four Overload
这种题出得好多啊。对于
钦定出来的只要一眼卡不掉,基本就是对的。
做法我写在 一类问题\二分图染色 里了。
\color{green}* Erase and Extend
注意到最优解一定是不停重复一个前缀。
可以枚举每个前缀二分哈希比较,因为重复的哈希容易计算。复杂度
然而有更高明的做法,
cin >> s;
int p = 1, i = 0, n = s.length();
for (; i < n; ++ i) {
if (s[i] > s[i % p]) break;
if (s[i] < s[i % p]) p = i + 1;
}
for (i = 0; i < K; ++ i) putchar(s[i % p]);
对着代码证明正确性很简单,这里就不证了。
感觉在赛场上,二分哈希也不亏。
upd:真的又出了这个做法的题,就是那个叫你所有下标异或上一个数,求最小字典序的 F。
Figure Fixing
和 [NOI Online #1] 的 T1 很像。
如果一张图是非二分图,则可以在和的奇偶性不变的前提下任意改变点权。取一棵生成树然后讨论一下即可。
如果是二分图,两部分的差不能改变。
Colorful Operations
对颜色连续段打懒标记,set 维护连续段,连续段变化的时候在树状数组上处理。
Fair Share
做法我写在 一类问题\二分图染色 里了。
Fibonacci Additions
哈希会被定向卡,有没有什么确定性算法?
考虑作斐波那契差分(瞎说的)。满足:
考虑用两棵树状数组维护
i 这个地方被加了iK+B ,每次修改时,给i 的K 后缀加x ,给i 的B 后缀减(i-1)x 即可。
这题要区间加等差数列区间求和,类似地维护
AmShZ and G.O.A.T.
注意到一个序列 GOAT 充要条件(我也不会证,找找规律就看出来了)是
于是除了最开始相等的项,剩下的只有
Squid Game
说实话我个人觉得这题不比 Paint The Middle / Towers 难,然而一个评分 2200/2400 一个评分 3100。
我完全摸不准这种纯贪心题难度,感觉只要知道是纯贪心题,xjb 贪基本上都是对的。
所以难点在于识别出来这是贪心题。。大概想一想 dp 发现没法 dp(或者 dp 就是贪心)基本就是了。
首先,以任意点为根,对于一条 LCA 不是端点的链,只要选根都可以一次满足。
假设所有链都是 LCA 为端点,那肯定在保证合法的基础上,选取的点越浅越好,因此从深到浅依次选。因为浅了可以尽量满足 LCA 不是端点的链,而且对于 LCA 为端点的链,
- 如果选浅点不满足而选深点满足,说明这条链更深,而我们是从深到浅依次选,没有这种情况。
- 其它情况下都不劣。
因此这样是对的,最后特判一下根是不是要选。可以做到线性。
\color{green}* Points Movement
首先可以去掉所有已经被点包含的线段,互相包含的线段仅保留短的。这时,整个图长成:点 - 一些线段 - 点 - 一些线段...
题解做法:注意到一段在
我的做法:设
在
线段树维护
细节:转移应该是怎样的?
所以应该这样:把 $f(x,k)$ 既挂在 $k+1$ 的左端点上,又挂在 $k+1$ 的右端点上。
Good Graph
显然整个图一定总是仙人掌。
首先把改变连通性的边拿出来,这些一定会加。剩下的边需要判断
- 是否仍然是仙人掌。
- 链上 xor 和是否正确。
第二个问题很简单,线性 dfs 一遍预处理到根 xor 和。
第一个问题,如果仍然是,那就可以暴力覆盖,所以本质上是单点修改链上求和,树状数组即可。总复杂度单 log。
Jumping Around
题目就是求