天天看点

CF1515H口胡

居然一下就做出来了。。。不知道是不是对的/fad

考虑操作的本质,首先将所有元素插入线段树中。

来依次考虑每一种操作:

  1. 区间与

注意到这个操作类似将某些节点的右儿子合并到左儿子上,而一个节点最多被合并一次,所以可以暴力合并,如果没有兄弟那就打上标记。

  1. 区间或

和前者类似。

  1. 区间异或

这个操作是交换左右儿子,所以直接打上标记,前面没有兄弟的时候也可以打上相同的标记。

  1. 询问

这不是用脚维护一下就好了吗。

但是注意到这只对全局操作管用,所以考虑通过某种方式使得区间也管用。

首先将整个区间拆分成线段树上的区间。

对于一个区间,先进行上面的合并操作,再按照更高的位合并到别的区间上去。

但是如果是异或就很麻烦了。所以考虑将被修改的节点全部拉出来,修改完毕后再插入回去。

至于实现,我们注意到一次是对同一层的一车区间干相同的事。所以不妨对整颗线段树 BFS,然后在 BFS 序上开一颗平衡树,来维护没有被合并的点。

然后,将左右儿子合并的操作反过来,最后统一将区间打上异或标记。

一个节点会被合并 \(O(\log V)\) 次,所以会被插入平衡树 \(O(\log V)\) 次,所以复杂度应该是 \(O(n\log^2V+q\log n)\) 的。

继续阅读