线段树合并学习笔记
线段树合并学习笔记
学了一波,其实类似于fhq treap,
直接贴代码吧:
void merge(int &x,int y,int l,int r){
if(!x||!y){x=x+y; return;}
int mid=l+r>>1; w[x]+=w[y];
merge(lc,son[y][0],l,mid),merge(rc,son[y][1],mid+1,r);
}
至于为什么总复杂度是\(O(n log n)\):
在某一机房大佬为我讲解后总算明白了?:
其实线段树合并是O(总结点数)的,但一般开始时每一刻线段树(动态开点)有\(log n\)个节点,便是\(O(n log n)\)的了,
为什么呢?
每次合并,
我们就继承某一线段树没有、另一线段树有的节点,
合并消除共有的节点,(每一次递归消除一个),
所以消除总结点数个,需要同样的递归次数了。
完结撒花。\ \ ____ / /
\ \ |>_< | / /
-- --