社区讨论

关于线段树合并

P4094[HEOI2016/TJOI2016] 字符串参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj3k4op
此快照首次捕获于
2025/11/03 20:09
4 个月前
此快照最后确认于
2025/11/03 20:09
4 个月前
查看原帖
请问为什么本题的线段树合并 (x,y)(x, y) 时,
CPP
int Merge(int x, int y, int l, int r) {
    if (!x) return y;
    if (!y) return x;
    if (l == r) {
        tr[x].cnt |= tr[y].cnt;
        return x;
    }
    int mid = (l + r) >> 1;
    tr[x].ls = Merge(tr[x].ls, tr[y].ls, l, mid);
    tr[x].rs = Merge(tr[x].rs, tr[y].rs, mid + 1, r);
    pushup(x); return x;
}
这份代码是错误的。
CPP
int Merge(int x, int y, int l, int r) {
    if (!x || !y) {
        tr[++ct] = tr[x + y];
        return ct;
    }
    if (l == r) {
        tr[++ct].cnt = tr[x].cnt | tr[y].cnt;
        return ct;
    }
    int mid = (l + r) >> 1, nd = ++ct;
    tr[nd].ls = Merge(tr[x].ls, tr[y].ls, l, mid);
    tr[nd].rs = Merge(tr[x].rs, tr[y].rs, mid + 1, r);
    pushup(nd); return nd;
}
而这份代码是正确的。

回复

3 条回复,欢迎继续交流。

正在加载回复...