加载中...

ABC 460 F(树的直径性质,线段树动态维护树的直径)

F - Farthest Pair Query

需要清楚一条关于树的直径的性质:对于一棵树,已知其两个不同的子集 \(S,T\)(包含结点),其中:

  • \(a \in S, b \in S\),且 \((a, b)\)\(S\) 的直径
  • \(c \in T, d \in T\),且 \((c, d)\)\(T\) 的直径

结论:\(S \cup T\) 的直径等于子集 \(\{a, b, c, d\}\) 的直径

这个结论与 “两棵树加一条边合并成一棵树,求树的直径” 是类似的,

具体证明:

pmmjCVO.png

于是,对于两个集合合并成一个集合,我们便有了一个快速得到新集合直径的方法。每次操作相当于单点修改,很自然地会想到利用线段树维护每个子区间内所有黑点构成集合的直径的两个端点

求新集合直径的过程中需要得到任意两点的距离,如果每次线段树 pushup 时都用倍增 lca 求,每次修改的复杂度会达到 \(O(\log^{2}n)\);考虑优化,可以利用欧拉序 + 倍增表 \(O(n\log n)\) 预处理任意两点 lca,进而做到 \(O(1)\) 查询,总复杂度 \(O(q \log n)\)

code

posted @ 2026-06-08 12:06  小橘奏  阅读(10)  评论(0)    收藏  举报