线段树合并 & Dsu on tree
CF600E
线段树合并,每个节点下维护子树下每个颜色的数量,建立权值线段树
复杂度证明:叶子节点 \(O(log m)\)
Dsu on tree 重儿子信息保留,轻儿子信息递归计算一次,合并一次。
复杂度证明:对于一个点,最多经过 \(O(\log n)\) 条轻边,第一次被递归执行一次,每次被当作轻儿子子树节点,都会被合并一次 \(O(轻边个数+1)\) 复杂度正确
思想
线段树合并基于动态开点,是把子树信息合并,实现的基础是 pushup
可以 \(O(1)\) 完成,一般还是联系到区间问题。
而 \(DSU\) 其实是一个相当暴力的算法,但是经过一些优化,竟然也可以达到正确的复杂度。
两种算法都可以解决树上统计信息的问题,互补互用,实际遇到问题的时候要权衡利弊