假设
∣
S
∣
≥
2
|S|\ge 2
∣S∣≥2,设直径的两个端点为
s
s
s和
t
t
t
显然我们知道直径有一个中心
假如我起点不在半径上,那么我下一步会把所有在半径上的点占领
但是显然我可以把起点调整到半径上,然后把所有半径上的点占领
然后我们对于其他的点求出到半径上的点的最大距离,排序过后就可以得到
S
×
G
S\times G
S×G的的最大值
CF1387B2
对于一条边
(
u
,
v
)
(u,v)
(u,v),每条边对答案贡献最多为
2
min
(
s
i
z
[
u
]
,
n
−
s
i
z
[
u
]
)
2\min(siz[u],n-siz[u])
2min(siz[u],n−siz[u])
考虑找到重心,对除了重心外的点两两跨子树匹配
因为任意子树大小不超过
n
2
\frac{n}{2}
2n,所以存在两两配对的方案
细节问题就不说了
树的直径
给定一棵树,求编号
[
l
,
r
]
[l,r]
[l,r]内两点距离的最大值。
n
≤
1
0
5
n\le 10^5
n≤105
考虑树上两个点集
S
S
S和
T
T
T,若集合
S
S
S中的最远点对是
u
→
v
u\to v
u→v,
T
T
T中的最远点对是
w
→
x
w\to x
w→x,那么
S
∪
T
S∪T
S∪T的最远点对一定是
u
→
v
u\to v
u→v,
w
→
x
w\to x
w→x,
u
→
w
u\to w
u→w,
u
→
x
u\to x
u→x,
v
→
w
v\to w
v→w,
v
→
x
v\to x
v→x 六对之一
可以线段树维护。可以用欧拉序列求
L
C
A
LCA
LCA平衡复杂度做到预处理
O
(
n
log
n
)
O(n\log n)
O(nlogn),询问
O
(
1
)
O(1)
O(1)。