动态点分治
好吧,我想说,动态点分治思路好理解,但打起来真让人心累。 所谓动态点分治,就是点分治在线修改和查询。 此时,我们构造一个点分树,先找整棵树的重心,以他为根,将他和每个子树的重心连边,以此类推。 对于每个重心,我们维护一些需要的信息 我们在修改的时候,只需要沿着点分树往上跳修改信息就好了。 动态点分树到这里就讲完了,但真正的难点是你的维护和修改。 例题1:P2056 [ZJOI2007]捉迷藏 网址:https://www.luogu.com.cn/problem/P2056 这题被号称是最水的动态点分治,但是我看了两个小时才明白,然后又打了一个小时,呜呜。 我的代码借鉴了https://www.cnblogs.com/LadyLex/p/8006488.html 可是哪位大佬太强,两三句就说完了,我这里算是对他的补充说明吧。 找最长链,那么我们需要维护最长链和次长链,但是由于数据可以被修改,所以不能只维护这两条。 定义一个堆h2[i]用来维护以i为重心的树上的黑店到i的距离。 但是我们不可能每次修改都重新遍历整棵树重新计算h2吧,所以再定义h1[i]用于维护以i为重心的树上的黑点到i在点分树上的父亲的距离。 这样一来,h2里面只用存储它的每个子树的h1.top()了,哈哈哈。 但我们要求的是求出整棵树的最大值,那不简单,再来一个堆h3呗。