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

204

被折叠的 条评论
为什么被折叠?



