题解:P11539 [Code+#5] 方案计数
结论:建立析合树,若存在析点,答案为
首先将题意稍微转化一下,先确定每一层的划分,然后每次的 rand_int(0,1) 就不用管了,显然能生成
然后将点重新标号一下,从
对于
这就是经典的卡特兰数,所以
然后考虑暴力的算法,如果直接仿照上面的 DP,时间复杂度会达到
转而考虑原序列的本原连续段,一个连续段的定义是
取出所有这样的连续段,将其建成一棵树,这个树即析合树。
现在,我们首先说明存在析点(儿子序列的任意子区间都不是连续段)就无解。
对于这一次划分,首先不能从一个儿子的区间中分开,否则就和本原连续段的定义矛盾。因为析点的性质,导致其不存在任意一个合法的划分,答案即为
然后对于一个合点(儿子是正序或者逆序),同样的不能从一个儿子的区间中分开,把这些段看成一个点,那么就是首先任意建立这些点的二叉树,最后再从每个点递归下去。
于是答案是卡特兰数之积的形式也比较显然了。