Dsu On Tree

算法简介


Dsu on Tree 也称树上启发式合并,其主要用于解决一类针对子树信息的询问且无法使用 \(dfs\) 序 + 线段树解决的问题。

树上启发式合并的使用条件:

  • 只有询问操作
  • 需要将每个点依次统计求解,使用一般的算法复杂度过高。

算法流程


树上数颜色 为例,朴素的暴力是枚举每个节点,扫描以它为根的子树统计答案,同时,由于树上颜色数无法快速合并区间信息,故无法使用 \(dfs\) 序 + 线段树解决,树上莫队的时间复杂度又不够优秀,故需使用一种全新的数据结构维护。

Dsu on tree 的思想是在保证答案的同时,根据重链剖分的原理,合并一些重复的扫描,从而降低复杂度。

具体算法流程如下:

  • 我们开一个全局的桶来统计每个颜色的出现次数,以及一个变量calc来统计颜色种类数。
  • 由于我们只有一个全局桶,所以要记得随时清除颜色信息,即统计一个节点的答案时,桶内只能有以它为根的子树的颜色信息。
  • 在dfs到达某个节点时,可能处于三种状态:统计、消除、求解。
  • 当处于统计状态时,意味着我们仅仅需要遍历当前子树统计颜色信息。
  • 当处于消除状态时,意味着我们仅仅需要遍历当前子树将统计过的颜色信息反向消除掉。
  • 当处于求解状态时,意味着我们需要进行一套“完整的求解操作”,并保留以当前节点为根的子树的颜色信息

完整的求解过程是:

  • 递归求解轻儿子并消除信息(注意这里是求一个轻儿子删一个轻儿子)。
  • 递归求解重儿子
  • 统计轻儿子信息
  • 求解当前节点答案
posted @ 2022-08-08 20:44  0xFF_qwq  阅读(33)  评论(0)    收藏  举报