码迷,mamicode.com
首页 > 其他好文 > 详细

倍增/线段树维护树的直径 hdu5993/2016icpc青岛L

时间:2018-09-19 16:21:16      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:最大   倍增   树的直径   合并   联通   问题   bsp   dfs序   包含   

题意:

给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径

点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一定在查询区间里

这样合并的正确意义也就有保证了

倍增/线段树维护树的直径 hdu5993/2016icpc青岛L

标签:最大   倍增   树的直径   合并   联通   问题   bsp   dfs序   包含   

原文地址:https://www.cnblogs.com/ytytzzz/p/9674661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!