Description
有\(2^n\)个用\(1\ldots 2^n\)编号的的人,你需要将他们排成一排,然后两两对战,胜出者再按照在原序列中的顺序排成一排,再用上述方法淘汰,直到只剩下一个人。
至于两人比赛的规则,假设比赛的两个人的编号为\(x\)和\(y\),那么编号小者胜出。但是特别的,有\(m\)个人,他们一定可以击败\(1\)(但是他们在和其他人作战时按照上述规则)。
求问有多少种安排排列的方法,使得\(1\)最终胜出。
\(1\leq n\leq 16, 0\leq m < \min(2^n, 17)\)。
Solution
你事,一个,一个,一个数数题,,,(池沼)
我们队序列建一个满二叉树,那么很显然一个节点就代表了所在子树的最终胜出者。那么我们不妨固定\(1\)在头上(接下来我们会发现其他情况都是一样的,所以最终乘一个\(2^n\)就行),倘使有\([2, 2], [3, 4],\ldots,[2^{n - 1} + 1, 2^n]\)这\(n\)个区间所代表的节点不能为给定的\(m\)个人,那么\(1\)就能胜出。
但这样直接计数还是要飞,那么就容斥吧!
注意到我们只需要去限制\(n\)个节点,所以看起来状压DP是一个不错的决定。我们不妨将\(A\)从小到大排序,然后定义状态\(f_{i, s}\)表示考虑\(A_{i\ldots m}\)这些人,目前确定了至少集合\(s\)中的线段树节点的胜出点在考虑的人当中。转移的话就考虑\(A_i\)是否对\(s\)造成了贡献即可。最后对所有至少的集合容斥,然后就能得到恰好空集的情况,这也算是传统艺能力,,,
Code
1 |
|