线段树合并学习笔记
顾名思义
就是两颗线段树合成一个线段树
那合成的线段树是适合所有线段树吗
当然不是,是动态开点线段树
建树
这里建n个节点的时候,每个节点建一棵树
而且要按照一定的形态建立一条链
就是说如果最终形态是有n个数字的树,
那你初始化的那一条链子一定是这颗树上扣下来的
这样才方便合并
merge操作
最重要的操作
流程:
如果x和y有一颗树为空,直接返回
否则,他们上面肯定形态相同(建树你干了什么?)
那就留下一个x好了
处理一下size[x]什么的芭芭拉拉
然后右儿子,左儿子一同递归下去
int Merge(int x,int y)
{
if(!x||!y) return y;
size[x]+=size[y];
lc[x]=Merge(lc[x],lc[y]);
rc[x]=Merge(rc[x],rc[y]);
return x;
}
其他操作
类似于主席树,自己瞎yy就好