为啥在查询排名时没有右儿子应直接返回而不进行splay
查看原帖
为啥在查询排名时没有右儿子应直接返回而不进行splay
381949
Federico2903楼主2023/12/29 17:08

如题。萌新为了学习 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);
		}
	}
}
2023/12/29 17:08
加载中...