AGC026 题解
AtCoder Grand Contest 026
A - Colorful Slimes 2
单独考虑每个连续段,在第
code
B - rng_10s
首先如果
然后不妨把
那么问题就转化为了是否存在一组
如果存在,显然就是 No。
先化成
code
C - String Coloring
不妨先考虑一下某种合法染色方案具备什么性质。
先把
对于前半部分,制造一个长度为
先从前往后把红色字母依次加到
同理对于后半部分,制造出一个长度为
先从后往前把蓝色字母依次加到
如果这种染色方案是合法的,显然需要满足以下条件:
- 前半部分红色字母个数=后半部分蓝色字母的个数
-
L=R
然后折半搜索即可。用 map 统计会比较方便。
时间复杂度:
code
D - Histogram Coloring
容易想到先建出笛卡尔树然后 dp,不过笛卡尔树在这题并不是很好处理
考虑两步:用新的一层合并儿子、再往下拓展若干行。
假设现在再节点
再考虑如果最开始的一行填好了需要往下拓展(没有新的列出现),那么每个新的行必须和它上面一行反色。但是有特殊情况,就是蓝红相间的情况,因为新的一行从它上面一行复制下来同样是合法的。
那么考虑设
考虑在第二步(再往下拓展若干行)之前算
先考虑新加的若干个列,那么
然后合并儿子:(转移方程太好写出来了就不解释了)
最后考虑往下新拓展若干行:
时间复杂度:
code
E - Synchronized Subsequence
把 a 看成 b 看成
显然每一段都独立,并且每一段的所有前缀要么 a 的个数都大于 b 的个数,要么 b 的个数都大于 a 的个数。
考虑把这些区间分成开头是 a 的和开头是 b 的两类。
对于开头是 a 的区间,如有后面有开头是 b 的区间那么这段区间显然可以扔掉。否则,能搞成最优情况就形如 ababab...。
对于开头是 b 的区间,考虑第一个选择的 b 的位置在 a 的位置在 b 一定全部选上最优。然后又会产生些新的区间,最终结果就是把 b 选上是最优的。
那么可以枚举第一个选的 b 是在哪个位置,这样总共有
注意要从后往前枚举区间进行贪心。
code
F - Manju Game
毒瘤博弈论。
先把奇数位置上的盒子染成黑色,然后把偶数位置上的格子染成白色。
考虑一下选的流程:先手先选一个盒子,然后后手选择一个方向,两人交替把这个方向上的盒子选完。如果两人一共拿走了奇数个盒子,那么先手交出先手权利。
考虑如果先手交出先手权利,那么后手一定可以通过取剩下盒子最左边/最右边来转化成先手一开始就取整个大区间的最左边/最右边的情况。所以先手一定不会交出先手权。
那么当
当
但是决定每次消灭区间是哪侧的权利在后手,那么如何判断先手能否取到呢?
考虑二分先手能在取全黑的基础上能多得多少。
先把白盒子里的
这个可以通过 dp 求解,然后用前缀
时间复杂度:
code