线段树合并不是有两种写法
一种是把一颗树合并到另一颗上面,一种是新建一个把两个合并。
我这里写了一个题,用第一种就错了,第二种就对了,这两个有啥区别吗,还是我写错了,但是我一直用第一种写法写,还过了几个题,所以想知道两种写法除了空间占用是否不同。
inline int Merge(int a,int b,int L,int R)
{
if(!a) return b;if(!b) return a;
if(L == R) {
t[a].Sum += t[b].Sum;
return a;
}
int mid = (L + R) >> 1;
t[a].l = Merge(t[a].l,t[b].l,L,mid);
t[a].r = Merge(t[a].r,t[b].r,mid + 1,R);
Push_up(a);
return a;
}
inline int Merge(int a,int b,int L,int R)
{
if(!a || !b) return a + b;
int cur = ++ cnt;
t[cur].Sum = t[a].Sum + t[b].Sum;
int mid = (L + R) >> 1;
t[cur].l = Merge(t[a].l,t[b].l,L,mid);
t[cur].r = Merge(t[a].r,t[b].r,mid + 1,R);
//Push_up(a);
return cur;
}
第一个代码是第一种,一直 WA on 8,但是写第二种就过了。