括号树上莫队
考虑将括号序分块,莫队处理
考虑dfs到一个节点就加入x,离开这个节点就加入-x
考虑这个序列把-x看作x其实就是欧拉序
莫队的时候x表示add,-x表示del
考虑记录节点x在该序列中出现的位置为\(bg_x\),-x出现的位置为\(ed_x\)
考虑查询的路径为\(x\)到\(y\)的路径,且有\(bg_x<bg_y\)
如果\(bg_y\in [bg_x,ed_x)\),则x为y的祖先或者x=y
所有\(bg_k\in [bg_x,bg_y]\)且\(ed_k\notin [bg_x,bg_y]\)的节点就是路径上的节点
否则,考虑不是lca(x,y)的点,有
\(bg_k\in [ed_x,bg_y]\)和\(ed_k\in[ed_x,bg_y]\)恰好满足一个
对应到欧拉序上,
- \(lca(x,y)=x,[bg_x,bg_y]\)
- \(otherwise,[ed_x,bg_y]\),需要强制添加其lca
当莫队的查询区间为 [l,r] 时,有贡献的点即为括号序列在区间 [l,r] 内只出现过一次的点和lca
维护的时候就正常的做莫队即可,注意下有时候有lca直接特殊的操作一下最后撤销