merge 函数 (用于合并两棵树的函数) 顺序不能写反了,树上每个节点的权值都小于等于之前用于分裂两棵树的数值的那棵树一定是在左边,树上每个节点的权值都大于之前用于分裂两棵树的数值的那棵树一定是在右边 (即小的树在左边,大的树在右边)
举个例子,这是我的 merge 函数
int merge(int x, int y) {
if (!x || !y) return x + y;
if (tr[x].rnd < tr[y].rnd) {
tr[x].r = merge(tr[x].r, y);
pushup(x); return x;
} else {
tr[y].l = merge(x, tr[y].l);
pushup(y); return y;
}
}
之前错误的版本为此:
int merge(int x, int y) {
if (!x || !y) return x + y;
if (tr[x].rnd < tr[y].rnd) {
tr[x].r = merge(tr[x].r, y);
pushup(x); return x;
} else {
tr[y].l = merge(tr[y].l, x);
pushup(y); return y;
}
}