Haruna
每天都会给提督做早餐! 这天她发现早饭的食材被调皮的Shimakaze
放到了一棵
树上,每个结点都有一样食材,Shimakaze
要考验一下她。
每个食材都有一个美味度,Shimakaze
会进行两种操作:
1、修改某个结点的食材的美味度;
2、对于某条链,询问这条链的美味度集合中,最小的未出现的自然数是多少。即
mex
\text{mex}
mex 值。
请你帮帮Haruna
吧。
这里补一下带修莫队和树上莫队的坑。
如果这题放在序列上的话,即求一段区间的 mex \text{mex} mex 值的话,那就可以带修莫队+对数字分块即可做到 O ( n 5 3 ) O(n^{\frac{5}{3}}) O(n35) 。于是补一下带修莫队。
带修莫队就是具有单点修改和区间询问的莫队,具体来说就是将询问设有三个关键字:
l
l
l 所在的块,
r
r
r 所在的块,上一个修改的时间点,按照这个顺序来排序。然后每次询问的时候再维护
p
p
p 指针表示进行了几个修改操作即可。简略证明一下复杂度:设块的大小为
B
B
B ,修改次数为
c
c
c ,询问次数为
q
q
q ,则对于
p
p
p 指针来说,最坏移动
O
(
c
n
2
B
2
)
O(\frac{cn^2}{B^2})
O(B2cn2) 次,对于
l
l
l 指针来说,最坏移动
O
(
q
B
)
O(qB)
O(qB) 次 (怎么感觉在写物理) ,对于
r
r
r 指针来说,最坏移动
O
(
q
B
+
n
2
B
)
O(qB+\frac{n^2}{B})
O(qB+Bn2) ,每次修改都是
O
(
1
)
O(1)
O(1) ,于是复杂度为
O
(
c
n
2
B
2
+
q
B
+
n
2
B
)
O(\frac{cn^2}{B^2}+qB+\frac{n^2}{B})
O(B2cn2+qB+Bn2) 。一般题目不会说
c
,
q
c,q
c,q 大小姑且当做
m
m
m ,然后一般
n
=
m
n=m
n=m ,于是为
O
(
n
3
B
2
+
n
B
+
n
2
B
)
O(\frac{n^3}{B^2}+nB+\frac{n^2}{B})
O(B2n3+nB+Bn2) ,当
B
B
B 取
n
2
3
n^{\frac{2}{3}}
n32 时最优为
O
(
n
5
3
)
O(n^{\frac{5}{3}})
O(n35) 。
所以我们不妨考虑一下怎么在树上莫队。
如何把一个序列表示成一棵树呢? dfs \text{dfs} dfs 序?no,这里是一种特殊的欧拉序,它是当访问到一个点的时候加入序列中,当它的子树都访问完的时候再加一次,所以这个序列总共有 2 n 2n 2n 个点(即树上每个节点都会被加入两次)。然后我们设 s t [ x ] , e d [ x ] st[x],ed[x] st[x],ed[x] 表示 x x x 的初始和结束两个位置。
对于询问 x , y x,y x,y ,设 s t [ x ] < s t [ y ] st[x]<st[y] st[x]<st[y] ,于是我们分讨一下:
1.若
x
x
x 是
y
y
y 的祖先,那对于
[
s
t
[
x
]
,
s
t
[
y
]
]
[st[x],st[y]]
[st[x],st[y]] 这段区间来说,只有
(
x
,
y
)
(x,y)
(x,y) 这条链上的点会被加入一次,剩下的点都会被加入两次,所以我们只要维护一次的点即可。
2.若
x
x
x 不是
y
y
y 的祖先,则
e
d
[
x
]
<
s
t
[
y
]
ed[x]<st[y]
ed[x]<st[y] ,那对于
[
e
d
[
x
]
,
s
t
[
y
]
]
[ed[x],st[y]]
[ed[x],st[y]] 这段区间来说,
(
x
,
y
)
(x,y)
(x,y) 这条链上只有
l
c
a
lca
lca 没有被加入,剩下的点都被加入一次,其它点都被加入两次,所以特判一下
l
c
a
lca
lca 即可。
这样就完成了树上莫队啦!效率为 O ( n 5 3 ) O(n^{\frac{5}{3}}) O(n35) 。
代码正在码中,反正bzoj挂了(其实我想先交上作业)