线段树合并学习笔记

喜你入骨 提交于 2019-12-01 13:42:46

线段树合并学习笔记

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!