题意:
操作1.修改一个点的颜色(黑白互换)
操作2.询问所有黑色点之间最远距离
点分树:当我们可以形如点分治一样的统计答案,即每次确定一个重心,然后计算他们子树之间的贡献和得出答案的时候
我们可以将每个区域的重心作为其所有子树的重心的父亲,构成一颗新的树,显然这棵树的深度不会超过logn
每次对于单点(边)更新的时候,只要对其所有的父亲更新,就只需要更新log个点,这样的数据结构就是点分树
对于本题来说,最终的答案是在每个点作为链上一个点的时候,找每个点出发的最长链和次长链的和的最大值
所以用一个堆A维护每个点在点分树中子树下所有的点到这个点父亲的距离
再用一个堆B维护每个点所有儿子点的堆A的最大值,即每条链的最长的长度
最后用一个堆C维护每个点的最长值 + 次长值的大小
tips:
1.树上两两之间的点的距离可以rmq + ST表预处理之后O(1)查询,注意转化成序列不是dfs序,具体看代码
2.做一个供删除的优先队列,可以用两个优先队列A,B,一个正常用,删除操作就是把元素加入B,当AB顶部相同的时候一起弹出
#include