动态树分治

动态树分治

 

不得不说,树结构真是巧妙神奇。因为结构简单,所以变形剖多,在竞赛中玩出的花样也最多。

 

动态树分治,顾名思义,解决待修改的树分治问题。原本的树分治基于边或者重心的分治可以解决大多数静态树链问题,但是待修改怎么办?其实很简单,因为树结构是不变的,就是树分治的基础结构不变,对于修改和询问,只需要在第一次树分治的基础上用一些数据结构维护一些信息即可。

 

话虽这么说,但是实际上动态树分治是在树分治的基础上重新建了一颗新树,被叫做重心树。理解动态树分治需要先理解树分治的过程。树分治本身基于重心的划分,每次找到树重心,然后删除重心,树将变成若干棵子树,对于每颗子树重复这个过程。因为重心的性质,这个过程最多递归层数是log级别的,重心树也由此而来。

 

重心树的定义是,将树分治看做log层划分,上文说到树分治的重心划分最多log层,每层对应一些子树的重心,将第一次划分的重心即 原树的重心当做重心树的根,下一层子树的重心当成自己的孩子,依次做log次便建立了一颗树,称为重心树。根据树分治的性质,在重心划分过程中,我们枚举到了每个节点作为重心的情况,也就是说原树的每个节点都在重心树中。

 

重心树有很多很好的性质,比如深度最大为log级别,最长路径长度为log级别。

 

为了解决问题,我们需要用重心树维护一些东西。这些东西就是指重心所在子树的所有节点的信息。因为树分治有log层划分,每次划分最多n个点,所以需要维护的信息最多为NlogN个。其次,划分log层,每个节点最多属于log个重心,也就是说,每个点信息的更新只需对log个重心的信息进行更新。即更新复杂度为log级别。询问也是同样道理。

 

以上就是我对动态树分治的理解,不正确的地方希望大家指正。

 

除了动态点分治,还有动态边分治。道理是类似的,只是边分治的好处是对应的重心树是二叉树,处理更方便。

点赞