题解:P14991 战略游戏
感觉和 P14510 夜里亦始终想念着你 miss 是很像的题,都是对于复杂的判定进行计数,非常喜欢这种类型的计数题。
场上想到了一个很简单的做法,但是看着高水平选手都没过,我也知道这个做法大概率是错的,但是死活没看出来假在哪,晚上看题解才发现确实是有问题的。
首先考虑判定,这个是简单的:
设
首先根据题意,必然有
从上到下考虑新树中的每一个点,若已经有
否则,拉出
如果操作过程中流量被减成负数了,那么一定不合法,否则一定合法。
对着判定,我们考虑如何计数。
不难想到每个点会有一个颜色序列,表示这个点过程中的颜色变化。
那么这个队列每次做的就是,任意归并所有儿子处的队列,选择在开头加入或者不加入
这三个操作应该是好理解的,任意归并是因为儿子处颜色传上来没有顺序,在开头加入或者不加入
所以我们先应该求出上传颜色序列任意归并长度为
如果直接对着这个 DP 是非常好 DP 的,也是我场上的做法,但是我想不明白是哪里有问题,看了题解才发现:
事实上,我们需要定义三种颜色序列(其实也可以是两种,不过三种更严谨)
点颜色序列:每个点在染色过程中的颜色变化,并且队首一定是
上传点颜色序列:每个点上传到父亲的颜色所形成的队列。
边颜色序列:
这三个序列事实上是有区别的,我们来说明一下这三种序列的生成方式:
点颜色序列通过任意归并所有儿子处的边颜色序列生成。
上传点颜色序列:通过在点颜色序列的基础上,队首加入或者不加入
边颜色序列:通过扩展上传点颜色序列生成,扩展定义为将一种颜色复制任意次并插回原来的位置。
考虑点/上传点颜色序列与边颜色序列最大的不同在于什么:
点颜色序列一定不会有相邻相同的颜色,但是边颜色序列可能有,因为可能重复染色。
回过头来看我在场上的方法,问题在于:点和边的颜色序列是不一样的,上述做法把点边颜色序列混为一谈了。
此时我们可以断言:任意一种
这应该是可以理解的,因为根据判定,如果存在一个点颜色序列不同,那么到根链最终染色一定不同,同时一种染色方案一定也对应一种点颜色序列方案。
明确定义之后,我们再来考虑对于点染色序列计数,显然设
我们先归并儿子得到点颜色序列长度为
设每个儿子的上传点颜色序列长度为
由于归并之后不能有相邻位置同色,所以我们考虑容斥。注意这里容斥不能是容斥全局,而必须是对于每个儿子单独容斥!
设
最后还要任意归并,所以总方案数为:
在 DP 的过程中记录一下
不过注意特判
优化是容易的,我们提前用
当然,最后如果上个 NTT 优化二维卷积可以变成
最后根据点颜色序列生成上传点颜色序列是简单的,不过注意特判长度为点颜色序列为空的情况。