FHQ Treap WA & TLE 30pts 可能的原因警示后人
查看原帖
FHQ Treap WA & TLE 30pts 可能的原因警示后人
557961
Ephemeron楼主2024/10/31 14:45

mergemerge 函数 (用于合并两棵树的函数) 顺序不能写反了,树上每个节点的权值都小于等于之前用于分裂两棵树的数值的那棵树一定是在左边,树上每个节点的权值都大于之前用于分裂两棵树的数值的那棵树一定是在右边 (即小的树在左边,大的树在右边)

举个例子,这是我的 mergemerge 函数

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;
	}
}
2024/10/31 14:45
加载中...