有关此题的线段树合并做法
查看原帖
有关此题的线段树合并做法
225625
Alan_Zhao楼主2021/6/27 19:55

题解里的线段树合并全都长这样:

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;
}

它们在有一个点为空的时候,都直接返回了另一个点。这样为啥是对的?感觉父节点进行更新的时候有可能会影响到子节点的线段树。

2021/6/27 19:55
加载中...