题解里的线段树合并全都长这样:
int merge(int x,int y,int tl,int tr) {
if(x==0||y==0) return x|y;
if(tl==tr) {
int now=++tot;
tree[now].num=tree[x].num+tree[y].num;
return now;
}
int mid=(tl+tr)/2,now=++tot;
tree[now].ls=merge(tree[x].ls,tree[y].ls,tl,mid);
tree[now].rs=merge(tree[x].rs,tree[y].rs,mid+1,tr);
up(now);
return now;
}
或这样:
int merge(int u,int v,int l,int r)
{
if(!u||!v)return u|v;
int mid=l+r>>1,x=++tot;
t[x].siz=t[u].siz+t[v].siz;
t[x].lc=merge(t[u].lc,t[v].lc,l, mid );
t[x].rc=merge(t[u].rc,t[v].rc,mid+1,r);
return x;
}
它们在有一个点为空的时候,都直接返回了另一个点。这样为啥是对的?感觉父节点进行更新的时候有可能会影响到子节点的线段树。