关于线段树合并的两种写法
查看原帖
关于线段树合并的两种写法
381904
斜揽残箫楼主2021/8/4 22:10

线段树合并不是有两种写法

一种是把一颗树合并到另一颗上面,一种是新建一个把两个合并。

我这里写了一个题,用第一种就错了,第二种就对了,这两个有啥区别吗,还是我写错了,但是我一直用第一种写法写,还过了几个题,所以想知道两种写法除了空间占用是否不同。

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,但是写第二种就过了。

2021/8/4 22:10
加载中...