AGC021E Ball Eat Chameleons [思维,卡特兰数]

update:这篇博客的分析方法实在太丑陋了,更优美/正常的方法可以看这里

我受不了了,这题做一次忘一次,到头来还是不会做/px

思路

由于一个变色龙吃了一个红球之后还可以白吃一个蓝球,并且再吃红球不优,所以容易想到一个贪心判序列是否合法的方法:在\([1,n-1]\)都变红之前红球全都给还没有变红的变色龙,蓝球如果能给\([1,n-1]\)中只吃了一个红球的变色龙就给,否则给第\(n\)个变色龙;\([1,n-1]\)都变红之后红球全部给第\(n\)个变色龙,蓝球给的策略和之前相同。

然后如何计数呢?

设红球有\(R\)个,蓝球有\(B\)个,那么显然要满足\(R\ge B\)

容易发现是否合法主要和第\(n\)条变色龙能否变成红色有关,也就主要和第\(n\)条变色龙吃的蓝色球有关。令\(t=R-(n-1)\),显然第\(n\)条变色龙吃了\(t\)个红球。

令红球为1,蓝球为-1,那么仔细分析一下,发现在出现\(n-1\)个红球之前第\(n\)条变色龙吃的蓝球数就是最小前缀和。显然在这一段需要满足最小前缀和\(>-t\)

在第\(n-1\)个红球出现之后情况比较复杂,我们稍微分一下类。

\(R>B\)

考虑\(n-1\)个红球之后的蓝球,如果这些蓝球能被前\(n-1\)个红球抵消掉,那么第\(n\)条变色龙吃的蓝球数就一定\(<t\);如果不能全部抵消,那么就相当于前\(n-1\)个红球全都匹配了一个蓝球,而又有\(R>B\),所以第\(n\)条变色龙吃的红球数是大于蓝球数的。所以,后面不管什么顺序都是合法的。

与此同时,你发现后面不管怎么排,整体都满足最小前缀和\(>-t\),所以在\(R>B\)时最小前缀和\(>-t\)是充要条件。

\(R=B\)

此时显然如果要合法,那么每一个红球都需要匹配一个蓝球。而且为了第\(n\)个变色龙能够顺利变成红色,还需要第\(K\)个球是蓝色的。

\(K\)个球是蓝色很好搞,问题是如何保证\([1,n-1]\)的变色龙全都拿到一红一蓝呢?

好吧,你发现只要第\(n-1\)个红球之前的最小前缀和\(<-t\),那么后面也是一定可以匹配上的。

与此同时,由于我们强制第\(K\)个球是蓝色的,所以此时后面不管怎么排,整体都满足最小前缀和\(>-t\),所以在\(R=B\)时“最小前缀和\(>-t\)且最后一个球是蓝色”是充要条件。

于是卡特兰数的方法分析一下就好了。

代码

咕了。

posted @ 2020-02-13 21:26  p_b_p_b  阅读(318)  评论(0编辑  收藏  举报