其实已经做过很多道了,但自己直到现在才重视起来它
以下大部分是看的洛谷日志:=w=
它可以处理一些常见的树上问题:
1.每个节点的答案是其子树的叠加,考虑利用这个性质处理问题
2.就是你必须通过整个子树来更新自己当前节点的信息的这种题
具体实现:
先遍历其非重儿子,获取它的ans,但不保留遍历后它的check
遍历它的重儿子,保留它的chec
k再次遍历其非重儿子及其父亲,用重儿子的check对遍历到的节点进行计算,获取整棵子树的ans
注意:
1.为什么不合并第一步和第三步呢?因为check数组不能重复使用,否则空间会太大,需要在 O(n) 的空间内完成。
时间复杂度:O(nlogn)
优秀之处:可以水树套树的题和吊打树上莫队且常数小
练习题
CF600E Lomsat gelral(http://codeforces.com/problemset/problem/600/E)
题意翻译:树的节点有颜色,一种颜色占领了一个子树,当且仅当没有其他颜色在这个子树中出现得比它多。求占领每个子树的所有颜色之和。
UOJ284 快乐游戏鸡(http://uoj.ac/problem/284)
参考资料/扩展阅读
CF741D作者介绍的dsu on tree(http://codeforces.com/blog/entry/44351)
这位作者的题解(http://codeforces.com/blog/entry/48871)