动态点分治学习小记
动态点分治学习小记
今天做了两道动态点分治的题,再加上前面做的三道,感觉有了些感觉,简单的记一下吧
学习动态点分治的前提是有良好的点分治基础
性质
点分树有很好的性质,如子树 siz 和是 \(\Theta(n\log n)\) 级别的,高度是严格 \(\Theta(\log n)\) 的
所以说在点分树上,你可以记录每个点的子树信息,查询的时候暴力跳即可
那么先看看几道题目会有更深的理解
BZOJ 震波
动态点分治模板题
问距离 x 点不超过 k 的点权和,单点修改点权,所有边权为 1
如何理解点分治?考虑点分治的过程,可以看做一个点控制着一个联通块,然后将它断开,让剩下的点控制剩下的部分
要维护什么信息,一是和它距离不超过 k 的点且在它控制的联通块内的点权和,二是和它父亲(点分治父亲)距离不超过 k 的点且在它联通块的点权和
要怎么统计,我们臆想一下,我们要统计整棵树对 x 的答案,一开始什么也没统计,现在从 x 开始跳,先将 x 控制的联通块统计贡献,然后跳向点分树的父亲,但是显然父亲的块包含了它自己,这样会统计重复,那么我们统计的第二个信息就有用了,我们容斥一下将自己的贡献删掉即可,这样我们可以得到一个更大联通块的贡献,继续跳就行了
仔细思考一下,为什么这样跳可以,建点分树的意义何在
控制联通块是可以随便选点的,考虑一个极端情况,我们让每个点控制整棵树,也就是每个点为根记录第一个信息,显然询问时直接查询即可,但复杂度明显是 \(\Theta(n^2)\) 的,进一步考虑,让根节点控制整颗树,每个点控制根节点对应儿子的子树,那么只需要第一次统计一下自己的块,然后再和根节点容斥一下即可,这样我们也就发现了一个重要信息,两个联通块是可以合并查答案的,只需合并时容斥减一下即可,我个人认为据此才产生了动态点分治
HNOI 开店
和上题几乎完全相同
Ynoi成都七中
这题比较巧妙的
每个点有个颜色,问只出现编号在 [l, r] 的点和 x 形成的联通块中有多少种颜色
可以看看原题目
是联通块问题,所以可以考虑动态点分治
考虑一个联通块,可以找到点分树最浅的点,那么这个点控制的联通块完全包含 x 所在的联通块
那么我们只要考虑所有点和那个点连起来即可
那么记录所有点到那个点路径上编号的最大最小值,可以连起来显然是要求 [l, r] 包含它
数颜色经典问题,树状数组加离线即可
话说这题好妙啊,下次见到也不会做吧
其他
写到这里有些懒了,就简单过一下
捉迷藏
开三个堆维护即可
幻想乡战略游戏
好像是动态维护带权重心,从根节点一直跳即可