bzoj1095【ZJOI2007】捉迷藏 (动态点分治总结)

动态点分治,就是在普通点分治的基础上,把每一层重心与上一层的重心连起来,形成一颗点分树,然后在每个点维护该点作重心时管辖的子树的信息。修改某个点时就从点分树中该点的位置开始,一路向它的父亲更新,因为点分树深度 logn l o g n ,所以一次最多修改 logn l o g n 个点。

本题要求最远一对黑点的距离,因此用堆维护距离:
C堆:在点分树每个结点u维护以u为根的子树内各个黑点到u管辖子树的根的距离;
B堆:在点分树每个结点u维护u各个子树内黑点到对应son[u]管辖子树的根的距离的最大值,即各个son[u]内C堆的top;
A堆:在全局维护所有点中B堆(最大值+次大值)的值。
最后A堆的top即为答案。

注意,我们要建立的是可删堆。可删堆套路:建一个辅助堆,记录删除的数据,如果当前原堆与辅助堆堆顶相同就一起删掉,直到不同为止,这时原堆堆顶元素就是真实的。

你可能感兴趣的:(图论——点分治)