题意:
给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径
点10W,询问10W,询问相互独立
Solution:
考虑线段树/倍增维护数的直径
考虑dfs序的一个区间 [l, r] 是联通的
而我们知道了有 l <= k < r,
且知道 [l, k] 和 [k + 1, r] 两个区间的直径端点及长度
假设两个区间的直径端点分别为 (l1, r1) 和 (l2, r2)
那么 [l, r] 这个区间的直径长度为
dis(l1, r1) dis(l1, l1) dis(l1, r2)
dis(r1, l2) dis(r1, r2) dis(l2, r2)
六个值中的最大值
证明:
假设两个区间是通过边 (u, v) 联通的
且点 u 属于前一个区间,点 v 属于后一个区间
1) 如果新区间的直径不经过这条边
那么新区间直径就是 max(dis(l1, r1), dis(l2, r2))
2) 新区间的直径经过这条边
考虑 v 到后一个区间的点的最长距离
一定是到 l2 和 r2 两个点其中一个点的距离(树的直径的定义)
u 到前一个区间的点的最长距离同理
所以枚举四种情况即可
一个问题:
倍增/线段树维护的过程中,某个区间可能并不是联通的
那么继续进行上面的合并还能保证正确意义吗?
我们只要保证查询的区间是联通的,那么在这个区间查询的意义下
包含的每个区间都是有意义的,因为两个不连通的区间的LCA一定在查询区间里
这样合并的正确意义也就有保证了
原文地址:https://www.cnblogs.com/ytytzzz/p/9674661.html
时间: 2024-10-07 13:23:46