Treap60pts求助
查看原帖
Treap60pts求助
529694
Corzica楼主2022/11/17 21:52

WA 6-10

主要问题:在查询排名时可能会输出0,且正确答案数值很大

Code:

(flg与fflg均为调试中变量,无实际意义

#include<bits/stdc++.h>
using namespace std;
//Treap
struct node {
	int l, r, cnt, size, val, dat;
} a[100010];
int ccnt, root, n;
bool flg, fflg;
int New(int val) {
	a[++ccnt].val = val;
	a[ccnt].dat = rand();
	a[ccnt].cnt = a[ccnt].size = 1;
	return ccnt;
}
inline void upd(int p) {
	a[p].size = a[a[p].l].size + a[a[p].r].size + a[p].cnt;
}
void build() {
	New(-1000000000);
	New(1000000000);
	a[1].r = 2;
	root = 1;
	upd(root);
}
int GetRank(int p, int q) {
	if (p == 0) return 1;
	if (q == a[p].val) {
		fflg = false;
		return a[a[p].l].size + 1;
	}
	if (q > a[p].val) {
		fflg = false;
		return GetRank(a[p].r, q) + a[a[p].l].size + a[p].cnt;
	} else {
		return GetRank(a[p].l, q);
	}
}
int GetVal(int p, int q) {
	if (p == 0) return 1000000000;
	if (a[a[p].l].size >= q) {
		return GetVal(a[p].l, q);
	}
	if (a[a[p].l].size + a[p].cnt >= q) return a[p].val;
	return GetVal(a[p].r, q - a[a[p].l].size - a[p].cnt);
}
void zig(int &p) {
	int q = a[p].l;
	a[p].l = a[q].r;
	a[q].r = p;
	p = q;
	upd(a[p].r);
	upd(p);
}
void zag(int &p) {
	int q = a[p].r;
	a[p].r = a[q].l;
	a[q].l = p;
	p = q;
	upd(a[p].l);
	upd(p);
}
void Insert(int &p, int val) {
	if (p == 0) {
		p = New(val);
		return;
	}
	if (val == a[p].val) {
		a[p].cnt++;
		upd(p);
		return;
	}
	if (val < a[p].val) {
		Insert(a[p].l, val);
		if (a[p].dat < a[a[p].l].dat) zig(p);
	}
	if (val > a[p].val) {
		Insert(a[p].r, val);
		if (a[p].dat < a[a[p].r].dat) zag(p);
	}
	upd(p);
}
int GetPre(int val) {
	int ans = 1;
	int p = root;
	while (p) {
		if (val == a[p].val) {
			if (a[p].l > 0) {
				p = a[p].l;
				while (p > 0) {
					p = a[p].r;
					ans = p;
				}
				break;
			}
		}
		if (a[p].val > a[ans].val && a[p].val < val) {
			ans = p;
		}
		if (val > a[p].val) {
			p = a[p].r;
		} else {
			p = a[p].l;
		}
	}
	return a[ans].val;
}
int GetNext(int val) {
	int ans = 2;
	int p = root;
	while (p) {
		if (val == a[p].val) {
			if (a[p].r > 0) {
				p = a[p].r;
				while (p > 0) {
					p = a[p].l;
					ans = p;
				}
			}
			break;
		}
		if (a[p].val < a[ans].val && a[p].val > val) {
			ans = p;
		}
		if (val > a[p].val) {
			p = a[p].r;
		} else {
			p = a[p].l;
		}
	}
	return a[ans].val;
}
void Remove(int &p, int val) {
	if (p == 0) return;
	if (val == a[p].val) {
		if (a[p].cnt > 1) {
			a[p].cnt--;
			upd(p);
			return;
		}
		if (a[p].l || a[p].r) {
			if (a[p].r == 0 || a[a[p].l].dat > a[a[p].r].dat) {
				zig(p);
				Remove(a[p].r, val);
			} else {
				zag(p);
				Remove(a[p].l, val);
			}
			upd(p);
		} else {
			p = 0;
			return;
		}
	}
	val < a[p].val ? Remove(a[p].l, val) : Remove(a[p].r, val);
	upd(p);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	build();
	cin >> n;
	int op, p;
//	freopen("test.out", "w", stdout);
	for (int i = 1; i <= n; i++) {
		cin >> op >> p;
		if (op == 1) {
			Insert(root, p);
		} else if (op == 2) {
			Remove(root, p);
		} else if (op == 3) {
			cout << GetRank(root, p) - 1 << endl;
		} else if (op == 4) {
			cout << GetVal(root, p + 1) << endl;
		} else if (op == 5) {
			cout << GetPre(p) << endl;
		} else {
			cout << GetNext(p) << endl;
		}
	}
//	cout << "[]" << flg;
	return 0;
}
2022/11/17 21:52
加载中...