题意
给一 k e ke ke 树,求所有路径 ( x , y ) (x,y) (x,y),满足 x → y x \to y x→y 中,编号最小为 x x x,最大为 y y y 的数量。 n ≤ 2 × 1 0 6 n \leq 2 \times 10^6 n≤2×106。
题解
考虑到最大最小值问题,我们想到用笛卡尔树,而树上的笛卡尔树形态则类似
K
r
u
s
k
a
l
Kruskal
Kruskal 重构树(
x
,
y
x,y
x,y 在重构树上的
L
c
a
Lca
Lca 为原树上的路径
x
→
y
x \to y
x→y 上的最值)。
至于构建:
对于一
k
e
ke
ke 从大到小(
x
,
y
x,y
x,y 的
L
c
a
Lca
Lca 为原树路径上的最大值)的树,我们按照编号从小到大,假设当前的点为
p
p
p,设
p
p
p 连向的点中,编号小于
p
p
p,(
v
<
p
,
v
∈
p
v<p,v \in p
v<p,v∈p)的点的祖先的祖先为
p
p
p,(
x
=
g
e
t
(
v
)
,
f
a
[
x
]
=
p
x=get(v),fa[x]=p
x=get(v),fa[x]=p)。
于是我们构建两 k e ke ke 树,一 k e ke ke 从大到小,一 k e ke ke 从小到大。
我们发现: x → y x \to y x→y 合法,当且仅当 x x x 在一 k e ke ke 树上是 y y y 的祖先, y y y 在另一 k e ke ke 树上是 x x x 的祖先。
所以剩下的用 d f s dfs dfs 序,二维偏序这些随便算算即可。