dsu-on-tree-浅谈

发布时间 2023-07-13 21:34:44作者: NuclearReactor

dsu on tree,有名树上启发式合并,是借助重链剖分,可以在树上快速统计子树信息的一种算法,只能完成静态问题,不支持修改。

假设我们现在想询问一个子树中某个颜色的出现次数,首先我们把询问挂在节点上,\(O(n^2)\) 的做法显然。

我们考虑这样做:假设当前子树的根为 \(k\),我们按照下面的流程:

  • 解决所有除了重儿子之外的其它儿子的子树,并把统计的信息清零。
  • 解决重儿子的子树,不把统计信息清零。(注意到我们最多只能不清零一个子树的信息)。
  • 然后我们统计其它轻儿子的子树的信息。
  • 回答询问。
  • \(k\) 是重儿子,不清零,否则清零。

考虑这个算法的复杂度:

  • 首先,重链剖分保证了一个点往上走最多经过 \(O(\log n)\) 条轻边。
  • 一个点的信息被统计,首先是它的祖先轻边,其次是遍历到这个点,所以一个点会被统计 \(O(\log n)\) 次。
  • 所以复杂度是 \(O(n\log n)\)