关于本题线段树合并写法 问个问题
查看原帖
关于本题线段树合并写法 问个问题
844860
CommandSR楼主2025/8/1 19:58

为什么本题线段树合并写法一定要新开一个节点。

int Merge(int u, int v, int l, int r) {
    if (!u || !v) return u + v;
    int mid = (l + r) >> 1, x = ++rtot;
                        // 就是这里 ↑ 为什么一定要新开一个 x 不能在 u 基础上修改
    seg[x].sum = seg[u].sum + seg[v].sum;
    lc(x) = Merge(lc(u), lc(v), l, mid);
    rc(x) = Merge(rc(u), rc(v), mid + 1, r);
    return x;
}

错误的

void Merge(int &u, int &v, int l, int r) {
    if (!u || !v) { u += v; return; }
    seg[u].sum += seg[v].sum;
    if (l == r) return;
    int mid = (l + r) >> 1;
    Merge(lc(u), lc(v), l, mid), Merge(rc(u), rc(v), mid + 1, r);
}
2025/8/1 19:58
加载中...