merge 操作不当导致树的结构与 rand() 有关,答案的正确性随时间周期性变化。如有此种症状,请再三确认 merge 操作的顺序,一定是从小 merge 到大:
inline void insert(int v) {
int linkA, linkB;
split(root, v, linkA, linkB);
root = merge(merge(linkA, newNode(v)), linkB);
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);
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;
}