【CF1083C】Max Mex(LCA,ST表,树上
路径并,
线段树二分)
题面
给定一棵有
n
n
n 个点的树,每个节点有点权。所有的点权构成了一个
0
∼
n
−
1
0~sim~n - 1
0 ∼ n−1 的排列。有
q
q
q 次 *** 作,每次 *** 作
1
1
1 为交换两个点的点权, *** 作
2
2
2 为查询
M
e
x
(
l
)
Mex(l)
Mex(l) 值最大的
M
e
x
(
l
)
Mex(l)
Mex(l) 值,其中
l
l
l 是树上的一条路径。定义一条路径
l
l
l 的
M
e
x
Mex
Mex 值
M
e
x
(
l
)
Mex(l)
Mex(l) 为这条路径上最小的没有出现过的自然数。
n
,
q
≤
2
×
1
0
5
n,qleq 2times10^5
n,q≤2×105 .
题解
这道题思路不难,最大 Mex 可以翻译成:最大的
r
r
r 满足权值在
[
0
,
r
)
[0,r)
[0,r) 以内的点被一条简单路径覆盖。
于是我们可以对每个前缀
[
0
,
r
)
[0,r)
[0,r) 维护路径并,若发现并出来的不是条链,那么从此标记为不合法,后面就不用再合并了。我们可以把两条路径的最多 4 个点建一棵虚树,判断是否是条链,以及链的两端是什么。
为了快速地在路径并中得到 LCA,我们需要用欧拉序 + RMQ,用 ST表光速查找 LCA 。这样路径合并就是
O
(
1
)
O(1)
O(1) 的了。
为了维护前缀路径并,我们能否让每个点存一条到权值 0 的路径呢?当然不行,因为权值 0 的点可能会改。那么我们单点就存一条当前权值到前一个权值的点,这样修改 *** 作数就是
O
(
1
)
O(1)
O(1) 的了。
最后在线段树上二分就好了,时间复杂度
O
(
n
log
n
)
O(nlog n)
O(nlogn) ,常数略大。
CODE
#include
评论列表(0条)