点分治这东西虽然很早就打过一次板子,但一直理解的不透彻,而且再去看之前写的那个板子居然写的是n^2暴力。。。然后今天又重新学了一遍
点分治的思想和树链剖分很类似,将一颗树尽可能均匀的分开,再合并答案,如果分开的那个点找的好的话复杂度就是nlogn的(不算其中答案统计的复杂的)
而要找的这个点就是重心,很容易就能脑补出,如果一个点是重心,那么以这个点为根的向下走一步的所有子树中节点数的最大值最小,这和树链剖分中找重链的方法很类似;
然后就能愉快的递归 O(n)找重心了;
接下来就是如何利用这个性质统计答案;
一般点分治所要统计的答案都有一个性质,就是可以按照经过的某个定点分类;
大多情况下都是按照是否经过当前重心来分类的;
这样就可以将所有经过当前重心的边统计一下,再递归找子树的重心,递归下去之后就将下一次递归完全限制在那颗子树里了,也就是接下来找的边都不会经过之前那个重心;
关于统计答案,一般有两种常用的姿势;
①略微加点容斥,将当前点向外的所有点对的答案先都加进来,再从儿子那里把经过重复边的那些点对都删去;
②分开寻找每一颗子树,用之后寻找的子树来和之前找的子树之间更新答案;
这两种方法都有其限制,一般根据题目来变通;
题目暂时不贴,太晚了。。。
点分治 学习笔记
最新推荐文章于 2022-10-17 20:38:08 发布