Codeforces 杂题选做 I
feecle6418 · · 个人记录
省选快要退役了,非常慌。(more and more vegetable what should I do?)
\color{green}* Black and white tree
换根 dp,充要条件是,存在两个点,两个之中一个到 lca 距离
不过上面做法其实是麻烦了,考虑子树内部推上来,当且仅当
-
- 儿子能到某个黑点,且儿子内黑点数
\ge 2 。
这就真的是 simplify 的魅力了!!
credit:https://www.luogu.com.cn/blog/dottle/solution-cf1626e
\color{green}* A random code problem
容易发现只与
对每个余数分别 dp,设
可以把
观察到最终求的是
经过卡常,是可以通过的。
然而这种做法忽略了各个值之间的联系。
可以设
credit:https://www.luogu.com.cn/blog/sysjuruo/solution-cf1626f
Not escaping
伞兵 dp 题。
\color{red}* Cats on the upgrade
非常好的题!
考虑对括号的包含关系建一棵 括号树,每层括号的儿子就是其内部包含的第一层括号。
给每个点赋值
那么 easy ver 就变成了子树求和。hard ver 就是从叶子一层一层删上去,只需要用树状数组维护子树和,删的时候顺便算一下
这个题高明于 gyh 出的 艺术家?打脸了 连删除方式都一模一样 这两个题好像完全没区别 唯一的区别是他给的“树”非常隐蔽。
Bipartite array
注意到只要有三元环一定不行。
换个角度,没有三元环,意味着除去前缀最大值剩下的数也是递增的,所以一定是二分图。
也即,充要条件是能分为两部分,都递增。
设
Subsequences galore
容斥,就成子集和变换了。
\color{red}* Too many imposters
其实流程真的是 试错+brainstorm,可惜这种题太少了。
首先分成 abcdef 如果 abc 0 def 1,abc,bcd,cde,def 一定会有两个相邻的是 01。于是就找到了一个 0 一个 1,拿这两个去问出其他的就可以了(这是寻找关键元)。
但是这样要
\color{green}* Christmas chocolates
这就是典型的,OI 赛场上做麻烦不影响,CF 直接导致爆炸的题!
题解做法:注意到
虽然很简单但是……
Flipping Range
注意到可以把长度取 gcd。
考虑差分。
对于固定的长度
如果配对的
https://codeforces.ml/gym/367154/submission/145206849
\color{green}* Divan and Kostomuksha
直接 dp
Divan and a cottage
动态开点线段树上二分出分界点(因为总是增函数)。直接模拟。
Array equalizer
从前往后做可以发现,不存在最优化的问题,方案唯一。进一步发现贡献也是定的形式:
Middle Duplication
简单贪心题。如果没有 父亲 - 儿子 的限制,肯定是从前往后能选就选(预处理后一个不同字符)。
现在有了 父亲 - 儿子 的限制,注意到左儿子总在我前面,右儿子总在我后面,如果左儿子里面有一个能够变小的点,那一定会变小,就算会导致我这里变大,我也在左儿子之后。
所以贪心策略是:
- 先递归左儿子,如果需要 duplicate 就把祖先链都 duplicate。
- 如果回溯时发现自己已经 duplicate 了,再去递归右儿子,否则直接返回。
\color{red}* Math Test
最大化含有绝对值的式子的和,可以枚举绝对值的正负号,分别求最大值。因为只要正负号不对就会使答案变小。
\color{green}* Quadratic Set
首先注意到答案总大于等于
- 答案是
n-1,n-2 的时候,删掉的数总在n/2 与n 旁边。 - 答案是
n-3 时,n-1 答案总是(n-1)-2 。
故枚举所有可能的删数情况即可。判断合法性比较麻烦,我用到了 floor_sum。
题解给出了更高明的做法:对质因子随机赋哈希值,那可以
接着对
- 如果
n 是奇数,直接删去n 。现在把(2i-1)!,(2i)! 配对,可以发现只剩下了2\times 4\times \dots - 如果
n/2 是奇数,删去2! ,现在2 的幂次也是偶数。可以直接忽略。 - 剩下的就是
(n/2)! ,删去n/2 即可。
感觉构造还是挺妙。
Tree Coloring
没有变钦定,如果钦定了某些点满足题述条件,其实总方案数就是
现在考虑怎么算选点(其实是选边)方案数:其实就是每个点至多选一个儿子。故就是算
然而有
接着按照
卷积总次数是
Crazy Robot
BFS,看周围是否至多有一个方向是目前没有 BFS 到的。
\color{green}* Max Sum Array
我的做法:注意到最优解是按照如下方式生成的:首先把个数最多的放进序列,将序列划分为
比如:
|1| |1| |1 | |1 | |1| |1|
|1|2|1|2|1 |2|1 |2|1|2|1|
|1|2|1|2|13|2|13|2|1|2|1|
这样可以
题解做法:
注意到无论
由于最优方案要最大化贡献和,如果为我们忽略位置关系,最终排出来的位置里面,也一定是
故把贡献系数排个序,按照从小到大的顺序安排位置即可(其实和我的做法就一样了)。如果有很多贡献系数相同,它们可以随意排列,乘上
\color{red}* Armor and Weapons
如果
注意到,就算
Tree Queries
这题和 Eert Tuc Knil 一模一样,粘过来就过了。
还有一个