The solution of P9194

10黑寄。

problem & blog


考虑到处理加边并不简单,所以我们可以考虑一个黑点 \(p\),连边\((u,p)(p,v)\)

考虑在现在这棵树上连个点在原图中有变相连相当于有一个公共的 \(p\) 是它们的邻居。

于是删边操作等价于将一个点的儿子黑点并到父亲黑点上。

为了统计答案我们设 \(x\)\((a,b)\) 对应的黑点,\(y\)\((b,c)\) 对应的黑点。

那么我们考虑记录答案。

  1. \(x=y\):维护 \(siz_u = |son_u|\) (\(u\) 为黑点),此时贡献为 \(\sum_u (s_u + 1) \times s_u \times (s_u - 1)\)

  2. \(x \neq y\)\(x,y \in son_u\):相当于选择了两个儿子的 \(siz\) 相乘。维护 \(siz_u = \sum_{v \in son_u} siz_v\)

  3. \(x = fa_v\):注意父亲不能选 \(b\),所以贡献为 \(2siz_x \sum siz_y\)

列出式子后,我们发现需要维护以下数据:

  • 白点 \(u\) 的儿子数目 \(siz_u\)
  • 黑点 \(u\) 的儿子的 \(siz\) 值之和,也可以存到数组 \(siz\) 里。
  • 白点 \(u\) 的儿子的 \(siz\) 值之和 \(t_u\)

化简一下即可。

考虑由于最多影响到三代祖先,所以更新是 \(O(1)\) 的,动态维护答案即可。

总复杂度为 \(O(n)\)


code

posted @ 2023-10-18 09:06  sqrtqwq  阅读(18)  评论(0编辑  收藏  举报