Dsu On Tree
算法简介
Dsu on Tree 也称树上启发式合并,其主要用于解决一类针对子树信息的询问且无法使用 \(dfs\) 序 + 线段树解决的问题。
树上启发式合并的使用条件:
- 只有询问操作
- 需要将每个点依次统计求解,使用一般的算法复杂度过高。
算法流程
以 树上数颜色 为例,朴素的暴力是枚举每个节点,扫描以它为根的子树统计答案,同时,由于树上颜色数无法快速合并区间信息,故无法使用 \(dfs\) 序 + 线段树解决,树上莫队的时间复杂度又不够优秀,故需使用一种全新的数据结构维护。
Dsu on tree 的思想是在保证答案的同时,根据重链剖分的原理,合并一些重复的扫描,从而降低复杂度。
具体算法流程如下:
- 我们开一个全局的桶来统计每个颜色的出现次数,以及一个变量calc来统计颜色种类数。
- 由于我们只有一个全局桶,所以要记得随时清除颜色信息,即统计一个节点的答案时,桶内只能有以它为根的子树的颜色信息。
- 在dfs到达某个节点时,可能处于三种状态:统计、消除、求解。
- 当处于统计状态时,意味着我们仅仅需要遍历当前子树统计颜色信息。
- 当处于消除状态时,意味着我们仅仅需要遍历当前子树将统计过的颜色信息反向消除掉。
- 当处于求解状态时,意味着我们需要进行一套“完整的求解操作”,并保留以当前节点为根的子树的颜色信息
完整的求解过程是:
- 递归求解轻儿子并消除信息(注意这里是求一个轻儿子删一个轻儿子)。
- 递归求解重儿子
- 统计轻儿子信息
- 求解当前节点答案
浙公网安备 33010602011771号