想问一下,线段树合并时,我是这样写的。
int merge(int a,int b,int l,int r) {
if(!a || !b) return a|b;
int i = ++size;
cnt[i] = cnt[a] + cnt[b];
if(l == r) return i;int mid = l + r >> 1;
lc[i] = merge(lc[a],lc[b],l,mid);
rc[i] = merge(rc[a],rc[b],mid+1,r);
return i;
}
但是,如果这样写,是为什么出错,保证 cnt[0] = 0
int merge(int a,int b,int l,int r) {
// if(!a || !b) return a|b;
int i = ++size;
cnt[i] = cnt[a] + cnt[b];
if(l == r || !a || !b) return i;int mid = l + r >> 1;
lc[i] = merge(lc[a],lc[b],l,mid);
rc[i] = merge(rc[a],rc[b],mid+1,r);
return i;
}