如题。萌新为了学习 LCT 特地学习 Splay。貌似 OI-Wiki 的代码锅了。我改了一下发现 rnk 没有判没有右儿子的情况,于是我写成了如下样子:
int rnk(int x) {
int res = 0, cur = rt;
while (1) {
if (!cur) return res + 1;
if (x < val[cur]) cur = ls(cur);
else {
res += siz[ls(cur)];
if (val[cur] == x || (!rs(x)))
return splay(cur), res + 1;
res += cnt[cur];
cur = rs(cur);
}
}
}
然后 WA on #2。
然而我改成这样就能 AC。
int rnk(int x) {
int res = 0, cur = rt;
while (1) {
if (!cur) return res + 1;
if (x < val[cur]) cur = ls(cur);
else {
res += siz[ls(cur)];
if (val[cur] == x)
return splay(cur), res + 1;
if (!rs(x)) return res + 1;
res += cnt[cur];
cur = rs(cur);
}
}
}