动态点分治学习小记

动态点分治学习小记

今天做了两道动态点分治的题,再加上前面做的三道,感觉有了些感觉,简单的记一下吧

学习动态点分治的前提是有良好的点分治基础

性质

点分树有很好的性质,如子树 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] 包含它

数颜色经典问题,树状数组加离线即可

话说这题好妙啊,下次见到也不会做吧

其他

写到这里有些懒了,就简单过一下

捉迷藏

开三个堆维护即可

幻想乡战略游戏

好像是动态维护带权重心,从根节点一直跳即可

posted @ 2020-07-21 19:18  Hs-black  阅读(132)  评论(0编辑  收藏  举报