警示后人(如果你是 FHQ Treap
查看原帖
警示后人(如果你是 FHQ Treap
1401594
Firsry楼主2025/7/29 17:32

merge 操作不当导致树的结构与 rand() 有关,答案的正确性随时间周期性变化。如有此种症状,请再三确认 merge 操作的顺序,一定是从小 merge 到大:

inline void insert(int v) {
		int linkA, linkB;
		split(root, v, linkA, linkB);
		root = merge(merge(linkA, newNode(v)), linkB);
    // A <= v, B > v, A -> v -> B
		return;
	}
	inline void del(int v) {
		int linkA, linkB, linkC;
		split(root, v, linkA, linkB);
		split(linkA, v - 1, linkA, linkC);
		root = merge(merge(linkA, merge(lsn(linkC), rsn(linkC))), linkB);
    // A < v, C = v, B > v, A -> C -> B
		return;
	}

还有 merge 函数内部,小蒟蒻坠机 1.5h 就在这个地方:

if (key(linkA) > key(linkB)) {
	rson(linkA) = merge(rson(linkA), linkB);
	pushUp(linkA);
	return linkA;
} else {
	lson(linkB) = merge(linkA, lson(linkB));
  // 本蒟蒻就是这一行的顺序颠倒了
	pushUp(linkB);
	return linkB;
}
2025/7/29 17:32
加载中...