ARC165E
\(n \le 100\)
又是一个期望线性性拆贡献的题目。
显然每个点只会删除 \(1\) 次,可以将题目转化为:一个排列 \(b\),按 \(i = 1, 2, \dots n\) 的顺序,若 \(b_i\) 所在连通块大小 \(\ge k + 1\) 就执行一次操作。正确性自证。
考虑一个连通块(子树)\(T\) 对答案的贡献。
- 如果 \(|T| \le k\),那么没有贡献。
- 否则有 \(p_T\) 的贡献,\(p_T\) 表示 \(T\) 在删除过程中成为独立连通块的概率。操作一次后 \(T\) 就不是 \(T\) 了,分解成了若干个更小的连通块。
考虑如何求 \(p_T\),要想 \(T\) 在删除过程中出现,需要满足所有 \(T\) 内的点在 \(b\) 中的位置在所有与 \(T\) 相连的点之后。设 \(|T| = x\),有 \(y\) 个点与 \(T\) 相连,\(p(T) = \frac{1}{\binom{x + y}{y}}\)。
这样就不要知道 \(T\) 的形态了。
接下来就是一个比较普通的计数问题了,使用树上背包问题即可。令 \(f(u, i, j)\) 表示 \(u\) 所在连通块的大小为 \(i\),与连通块相连的点有 \(j\) 个的连通块数量。转移不难,自己写一下吧。
一些细节:\(f(u, i, j)\) 与 \(f(v, i', j')\) 合并时,\(u\) 被算成了与连通块相邻的点,需要减掉。或者 \(j\) 中把 \(fa_u\) 踢掉,合并时新设一个 \(f(v, 0,1 ) = 1\) 即可,当然算答案时 \(fa\) 还是要算上(\(1\) 没有 \(fa\))。
时间复杂度:\(O(n^4)\)。
这种题的难点就是如何才能不记录 \(T\) 的形态,通过拆贡献的方式解决。比如这个题:\(p_T\) 只和 \(x, y\) 相关。
浙公网安备 33010602011771号