The solution of P9194
10黑寄。
考虑到处理加边并不简单,所以我们可以考虑一个黑点 \(p\),连边\((u,p)(p,v)\)。
考虑在现在这棵树上连个点在原图中有变相连相当于有一个公共的 \(p\) 是它们的邻居。
于是删边操作等价于将一个点的儿子黑点并到父亲黑点上。
为了统计答案我们设 \(x\) 为 \((a,b)\) 对应的黑点,\(y\) 为 \((b,c)\) 对应的黑点。
那么我们考虑记录答案。
-
\(x=y\):维护 \(siz_u = |son_u|\) (\(u\) 为黑点),此时贡献为 \(\sum_u (s_u + 1) \times s_u \times (s_u - 1)\)。
-
\(x \neq y\) 且 \(x,y \in son_u\):相当于选择了两个儿子的 \(siz\) 相乘。维护 \(siz_u = \sum_{v \in son_u} siz_v\)。
-
\(x = fa_v\):注意父亲不能选 \(b\),所以贡献为 \(2siz_x \sum siz_y\)。
列出式子后,我们发现需要维护以下数据:
- 白点 \(u\) 的儿子数目 \(siz_u\)。
- 黑点 \(u\) 的儿子的 \(siz\) 值之和,也可以存到数组 \(siz\) 里。
- 白点 \(u\) 的儿子的 \(siz\) 值之和 \(t_u\)。
化简一下即可。
考虑由于最多影响到三代祖先,所以更新是 \(O(1)\) 的,动态维护答案即可。
总复杂度为 \(O(n)\)。