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