Splay 死循环了
查看原帖
Splay 死循环了
726525
CuteChat楼主2024/7/14 15:50
#include <bits/stdc++.h>
using namespace std;
#define int long long

struct Splay {
	int son[300005][2], val[300005], sz[300005], fa[300005], cnt[300005];
	int tot = 0, rt;
	void push_up(int i) { sz[i] = sz[son[i][0]] + sz[son[i][1]] + cnt[i]; }
	bool get(int i) { return i == son[fa[i]][1]; }
	void clear(int x) { son[x][0] = son[x][1] = sz[x] = fa[x] = cnt[x] = 1; }
	void rot(int x) {
		int y = fa[x], z = fa[y], chk = get(x);
		son[y][chk] = son[x][chk ^ 1];
		if (son[x][chk ^ 1]) fa[son[x][chk ^ 1]] = y;
		son[x][chk ^ 1] = y;
		fa[y] = x;
		fa[x] = z;
		if (z) son[z][y == son[z][1]] = x;
		push_up(y); push_up(x);
	}
	void splay(int x) {
		for (int f = fa[x]; f = fa[x]; rot(x)) if (fa[f])
			rot(get(x) == get(f) ? f : x);
		rt = x;
	}
	void insert(int k) {
		if (!rt) {
			val[++tot] = k;
			cnt[tot]++;
			rt = tot;
			push_up(rt);
			return;
		}
		int cur = rt, f = 0;
		while (1) {
			if (val[cur] == k) {
				++cnt[cur];
				push_up(cur); push_up(f);
				splay(cur); break;
			}
			f = cur;
			cur = son[cur][val[cur] < k];
			if (!cur) {
				val[++tot] = k;
				cnt[tot]++;
				fa[tot] = f;
				son[f][val[f] < k] = tot;
				push_up(tot);
				push_up(f);
				splay(tot);
				break;
			}
		}
	}
	int rnk(int k) {
		int res = 0, cur = rt;
		while (1) {
			if (k < val[cur]) cur = son[cur][0];
			else {
				res += sz[son[cur][0]];
				if (!cur) return res + 1;
				if (k == val[cur]) {
					splay(cur);
					return res + 1;
				}
				res += cnt[cur];
				cur = son[cur][1];
			}
		}
	}
	int kth(int k) {
		int cur = k;
		while (1) {
			if (sz[son[cur][0]] >= k) cur = son[cur][0];
			else if (sz[son[cur][0]] + cnt[cur] >= k) {
				splay(cur);
				return val[cur];
			} else k -= cnt[cur] + sz[son[cur][0]], cur = son[cur][1];
		}
	}
	int pre() {
		int cur = son[rt][0];
		if (!cur) return cur;
		while (son[cur][1]) cur = son[cur][1];
		splay(cur);
		return cur;
	}
	int nxt() {
		int cur = son[rt][1];
		if (!cur) return cur;
		while (son[cur][0]) cur = son[cur][0];
		splay(cur);
		return cur;
	}
	void erase(int k) {
		rnk(k);
		if (cnt[rt] > 1) {
			cnt[rt]--;
			push_up(rt);
			return;
		}
		if (!son[rt][0] && !son[rt][1]) {
			clear(rt);
			rt = 0; //
			return;
		}
		if (!son[rt][0]) {
			int cur = rt;
			rt = son[rt][1];
			fa[rt] = 0; //
			clear(cur);
			return;
		}
		if (!son[rt][1]) {
			int cur = rt;
			rt = son[rt][0];
			fa[rt] = 0; //
			clear(cur);
			return;
		}
		int cur = rt;
		int x = pre();
		fa[son[cur][1]] = x;
		son[x][1] = son[cur][1];
		clear(cur);
		push_up(rt);
	}
} t;

int n, opt, x;


signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> opt >> x;
		if (opt == 1) {
			t.insert(x);
		} else if (opt == 2) {
			t.erase(x);
		} else if (opt == 3) {
			cout << t.rnk(x) << "\n";
		} else if (opt == 4) {
			cout << t.kth(x) << "\n";
		} else if (opt == 5) {
			t.insert(x);
			cout << t.val[t.pre()] << "\n";
			t.erase(x);
		} else {
			t.insert(x);
			cout << t.val[t.nxt()] << "\n";
			t.erase(x);
		}
	}
}

(初步猜测死循环),但不知道哪里死循环了,求助。

2024/7/14 15:50
加载中...