题解 AT3871 【[AGC021E] Ball Eat Chameleons】
既然是对球的颜色序列计数,那么就只需要考虑,对于每一个颜色序列,判断它是否可行。
假设总共喂了
首先考虑一只变色龙在什么情况下最终才会变成红色:
- 它吃的红球比蓝球多。
- 它吃的红球和蓝球一样多(且不为
0 个),但是吃的最后一个球是蓝球。
如果
如果
否则
对于一种方案,我们进行调整:
- 如果某一只变色龙吃的红球比蓝球多两个以上,可以拿出一个红球分配给别的变色龙。
这样调整之后,就一定是:一些变色龙吃的红球比蓝球多恰好一个,另一些一样多。
令 R 表示一个红球,B 表示一个蓝球。
也就是恰好有 R,其它
如果 R 的变色龙,那么考虑吃掉了最后一个球的变色龙,那么最后一个球必然是 B,那么去掉这个蓝球,就等价于
那么现在就至少有一只变色龙多吃一个 R,对于吃的一样多的变色龙,可以再调整:
如果它吃的不是恰好两个球(RB),那么可以在最后一个字符前取出一个 R 和一个 B,分给多吃了一个 R 的变色龙。
那么现在就变成了,每只吃的红球和蓝球一样多的变色龙,吃球的顺序都是 RB,它们的个数为
然后剩下的 R 然后满足条件了。
综上所述:对于 RB(有顺序)的子序列。
这等价于:对于每个前缀,这个前缀中的蓝球比红球最多多
(就是说这个前缀中无法参与匹配的蓝球数量不能超过
换句话说,令 R 为 B 为
可以看成从 R)或向上(B)走到
这是一类经典的组合问题,类似于卡特兰数的计算方法(翻转第一次碰到直线上方的部分),可以得到答案:
枚举
时间复杂度为