Treap 20 求调,回复的大佬都能取得理想的成绩
查看原帖
Treap 20 求调,回复的大佬都能取得理想的成绩
1033360
retamian楼主2023/10/20 22:53
#include <iostream>
#define lp tr[u].l
#define rp tr[u].r
#define INF 2047483647
using namespace std;
const int N = 1e5 + 10;
int idx = 0, root = 0, num = 0, ans = 0;
int ang, sum;
bool st[N];
struct node {
	int l, r;
	int k, val;
	int cnt, size;
} tr[N];
void pushup(int u) {
	tr[u].size = tr[lp].size + tr[rp].size + tr[u].cnt;
}
int getnode(int v) {
	tr[++idx].k = v;
	tr[idx].val = rand();
	tr[idx].cnt = 1;
	tr[idx].size = 1;
	num ++;
	return idx;
}
void zig(int &u) { //右旋
	int t = lp;
	lp = tr[t].r;
	tr[t].r = u;
	u = t;
	pushup(lp), pushup(u);
}
void zag(int &u) {
	int t = rp;
	rp = tr[t].l;
	tr[t].l = u;
	u = t;
	pushup(rp), pushup(u);
}
void build() {
	getnode(-INF), getnode(INF);
	root = 1, tr[1].r = 2;
	pushup(1);
	if(tr[1].val < tr[2].val) zag(root);
}
void insert(int &u, int k) {
	if (!u) u = getnode(k);
	else if (tr[u].k == k) tr[u].cnt ++,num ++;
	else if (tr[u].k > k) {
		insert(lp, k);
		if (tr[lp].val > tr[u].val) zig(u);
	} else {
		insert(rp, k);
		if (tr[rp].val > tr[u].val) zag(u);
	}
	pushup(u);
}
void remove(int &u, int k) {
	if (!u) return ;
	else if (tr[u].k == k) {
		 if (lp || rp) {
			if (!rp || tr[lp].val > tr[rp].val) {
				zig(u);
				remove(rp, k);
			} else {
				zag(u);
				remove(lp, k);
			}
		} else{
		    num -= tr[u].cnt , ans+=tr[u].cnt;
		    u = 0;
		}
	} else {
		if (tr[u].k > k) remove(lp, k);
		else remove(rp, k);
	}
	pushup(u);
}
int getnum(int u, int rank) {
	if (!u) return -1;
	if (tr[lp].size >= rank) return getnum(lp, rank);
	else if (tr[lp].size + tr[u].cnt >= rank) return tr[u].k;
	else return getnum(rp, rank - tr[lp].size - tr[u].cnt);
}
void find(int u) {
	if (!u) return;
	if (st[u]) return;
	if (tr[u].k != -INF &&  tr[u].k != INF) tr[u].k += sum;
	find(lp), find(rp);
	if (tr[u].k < ang && tr[u].k != -INF && tr[u].k != INF) st[u] = 1 , remove(root, tr[u].k);
	pushup(u);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n >> ang;
	build();
	char a;
	int q;
	for (int i = 1; i <= n; i++) {
		cin >> a >> q;
		if (a == 'I') {
			if (q < ang) continue;
			insert(root, q);
		} else if (a == 'A') {
			sum += q;
			find(root);
			sum = 0;
		} else if (a == 'S') {
			sum -= q;
			find(root);
			sum = 0;
		} else {
		    int t = getnum(root, num - q);
			if(t == -INF) cout<<-1<<endl;
 	          else cout<<t<<endl;
		}
	}
	cout<<ans<<endl;
	return 0;
}
2023/10/20 22:53
加载中...