此题显然有O(n)做法,喵喵喵?
解法:
让我们考虑一种颜色对答案的贡献
我们考虑把树中这种颜色的点都删掉,那么就会有很多的小树,这些小树中的点互相之间不会产生贡献,而不同树的两个点之间会产生贡献。
由此,我们可以得到每一种颜色,点的sum值就是 n - 所在小树的size。
由此,一个点的sum就是 n * 颜色数 - 每种颜色节点时所在小树的size。
我们考虑对于一棵小树的size,存在深度最小的节点上,那么后面就可以用树上差分实现覆盖。
求size,在回溯时遇到与当前颜色相同的点,就把整一颗子树的节点都删掉,那么一个点的答案就是, 子树的size - (当前删的个数 - 遍历时删的个数)。
因为每个节点只有一个颜色,所以一个节点会记录一次答案,特别的根节点的父亲设为所有颜色都有,全部统计一下。然后就树上差分传递下去,统计答案。
具体看代码吧。。。喵喵汪!!!(奇丑无比)
1 |
|
大家见谅,讲得自己都qwq了。。。