动态点分治总结
其实也没有做很多道题,但是还是总结一波吧.......
要知道动态点分治,首先得知道点分治.
点分治就是对于一个联通块,求出这个联通块的重心,然后把这个联通块分为很多个联通块,这些联通块都为这个重心的子树,那么求出这些子树对于重心的贡献,然后递归地做下去,由于重心的每一棵子树大小都小于联通块的一半,那么可以达到快速求解的目的.
动态点分治,在点分治的基础上,利用分治的过程重新构建一颗点分树,那么每一次修改都只会影响到点分树上的父亲节点,重新计算对于这些节点的贡献即可,由于点分树的高度是严格log的,那么每一次修改都只需要修改log个节点的贡献.
在修改的过程中,动态点分治可以十分灵活,不过不可避免的要写个求LCA,个人的习惯是写树链剖分,因为复杂度不是满的.对于维护,可以有很多种维护方式,通常都需要维护联通块到自己这个重心,和父亲重心的贡献,至于用什么来维护,根据题目而定,像线段树(动态开点),堆,数组等都是可以的.