线段树合并学习笔记

线段树合并学习笔记

学了一波,其实类似于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)\)的了,
为什么呢?
每次合并,
我们就继承某一线段树没有、另一线段树有的节点,
合并消除共有的节点,(每一次递归消除一个),
所以消除总结点数个,需要同样的递归次数了。
完结撒花。   ____ / /
   |>_< | / /
-- --

猜你喜欢

转载自www.cnblogs.com/ljk123-de-bo-ke/p/11688871.html