CF1515H口胡

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

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

来依次考虑每一种操作:

  1. 区间与

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

  1. 区间或

和前者类似。

  1. 区间异或

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

  1. 询问

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

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

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

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

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

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

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

一个节点会被合并 O(logV) 次,所以会被插入平衡树 O(logV) 次,所以复杂度应该是 O(nlog2V+qlogn) 的。

posted @   Prean  阅读(342)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
var canShowAdsense=function(){return !!0};
点击右上角即可分享
微信分享提示