dsu-on-tree-浅谈
dsu on tree,有名树上启发式合并,是借助重链剖分,可以在树上快速统计子树信息的一种算法,只能完成静态问题,不支持修改。
假设我们现在想询问一个子树中某个颜色的出现次数,首先我们把询问挂在节点上,\(O(n^2)\) 的做法显然。
我们考虑这样做:假设当前子树的根为 \(k\),我们按照下面的流程:
- 解决所有除了重儿子之外的其它儿子的子树,并把统计的信息清零。
- 解决重儿子的子树,不把统计信息清零。(注意到我们最多只能不清零一个子树的信息)。
- 然后我们统计其它轻儿子的子树的信息。
- 回答询问。
- 若 \(k\) 是重儿子,不清零,否则清零。
考虑这个算法的复杂度:
- 首先,重链剖分保证了一个点往上走最多经过 \(O(\log n)\) 条轻边。
- 一个点的信息被统计,首先是它的祖先轻边,其次是遍历到这个点,所以一个点会被统计 \(O(\log n)\) 次。
- 所以复杂度是 \(O(n\log n)\)。