Treap WA 44pts 求调
查看原帖
Treap WA 44pts 求调
1211668
WMY_楼主2025/6/17 19:24
#include <bits/stdc++.h>
#define dbg(x) cerr << #x << " = " << x << "\n"
#define N 100005
using namespace std;
using i64 = long long;
using u64 = unsigned long long;

struct Node {
	int val, rnd;
	int cnt, sz;
	int lc, rc;
};

int rt, idx;
Node tr[N];

int node(int v) {
	tr[++idx] = {v, rand(), 1, 1, 0, 0};
	return idx;
}

void up(int p) {
	tr[p].sz = tr[tr[p].lc].sz + tr[p].cnt + tr[tr[p].rc].sz;
}

void zig(int& p) { // 左旋 
	int q = tr[p].rc;
	tr[p].rc = tr[q].lc;
	tr[q].lc = p;
	up(q);
	up(p);
	p = q;
}

void zag(int& p) { // 右旋 
	int q = tr[p].lc;
	tr[p].lc = tr[q].rc;
	tr[q].rc = p;
	up(q);
	up(p);
	p = q;
}

void insert(int& p, int v) {
	if (!p) { p = node(v); return; }
	if (v == tr[p].val) { ++tr[p].cnt; }
	else { insert(v < tr[p].val ? tr[p].lc : tr[p].rc, v); }
	if (tr[tr[p].lc].rnd > tr[p].rnd) { zag(p); return; }
	if (tr[tr[p].rc].rnd > tr[p].rnd) { zig(p); return; }
	up(p);
}

void erase(int& p, int v) {
	if (!p) { return; }
	if (v == tr[p].val) {
		if (tr[p].cnt > 1) { --tr[p].cnt; }
		else {
			if (!tr[p].lc || !tr[p].rc) { p = tr[p].lc | tr[p].rc; return; }
			else {
				tr[tr[p].lc].rnd > tr[tr[p].rc].rnd ? (zag(p), erase(tr[p].rc, v))
													: (zig(p), erase(tr[p].lc, v));
			}
		}
	}
	else { erase(v < tr[p].val ? tr[p].lc : tr[p].rc, v); }
	up(p);
}

int qry_rk(int p, int v) {
	if (!p) { return 1; }
	if (v < tr[p].val) { return qry_rk(tr[p].lc, v); }
	if (v == tr[p].val) { return tr[tr[p].lc].sz + 1; }
	return tr[tr[p].lc].sz + tr[p].cnt + qry_rk(tr[p].rc, v);
}

int kth(int p, int k) {
	if (!p) { return 2E9; }
	if (k <= tr[tr[p].lc].sz) { return kth(tr[p].lc, k); }
	if (k <= tr[tr[p].lc].sz + tr[p].cnt) { return tr[p].val; }
	return kth(tr[p].rc, k - tr[tr[p].lc].sz - tr[p].cnt);
}

int pred(int p, int v) {
	if (!p) { return -2E9; }
	return v <= tr[p].val ? pred(tr[p].lc, v)
						  : max(tr[p].val, pred(tr[p].rc, v));
}

int succ(int p, int v) {
	if (!p) { return 2E9; }
	return v >= tr[p].val ? succ(tr[p].rc, v)
						  : min(tr[p].val, succ(tr[p].lc, v));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;
	while (n--) {
		int opt, x;
		cin >> opt >> x;
		if (opt == 1) { insert(rt, x); }
		else if (opt == 2) { erase(rt, x); }
		else if (opt == 3) { cout << qry_rk(rt, x) << "\n"; }
		else if (opt == 4) { cout << kth(rt, x) << "\n"; }
		else if (opt == 5) { cout << pred(rt, x) << "\n"; }
		else if (opt == 6) { cout << succ(rt, x) << "\n"; } 
	}
}

rt,下载回数据和标准输出是一样的,但就是 WA,而且每次 WA 的字符位置不一样。

2025/6/17 19:24
加载中...