dsu on tree(树上启发式合并)

其实已经做过很多道了,但自己直到现在才重视起来它

以下大部分是看的洛谷日志:=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)

 

原文地址:https://www.cnblogs.com/lkx422/p/11805428.html