CF1111E

给定 \(n\) 个节点的数及 \(q\) 组询问。每组询问给定 \(k\) 个节点 \(a_1 \sim a_k\) 以及根 \(r\)\(m\)。问有多少种划分方案使得最多 \(m\) 组且满足:

  • 每个点一个组,每个组至少一个点。
  • 一个组内不能有两个点为祖孙关系。

\(n, q, \sum k \le 10^5, m \le \min(300, k)\)

首先每组询问只和这 \(k\) 个点以及 \(r\) 有关,把虚树建出来肯定没有坏处,能简化问题。

发现在虚树上直接暴力 DP 是不行的,因为设计出状态是 \(dp_{u, i}\) 表示 \(u\) 的子树内分成 \(i\) 个组的方案数,合并子树时得到的组数 \(k \le i + j\) 而不是传统的 \(k = i + j\)

换一个角度,考虑每个节点 \(u\) 的贡献。假若分成 \(cnt\) 组,实际上 \(u\) 的贡献就是 \(cnt - c\)\(c\)\(u\) 的祖先个数)。最后再除掉 \(cnt!\) 即可。

但是这有个问题,这样分出来有些组可能时空的,要减去 \(cnt' < cnt\) 的,系数是 \(\binom{cnt}{cnt'}\)。所以用 \(O(m^2)\) 算一下即可。

时间复杂度:\(O(\sum k \log k + m^2 + km)\)。 可以通过。

posted @ 2025-11-07 21:29  xiehanrui0817  阅读(2)  评论(0)    收藏  举报