treap 0pts,WA + TLE + RE求条
查看原帖
treap 0pts,WA + TLE + RE求条
1020531
liuyiyang_khaili楼主2025/7/24 10:25
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
struct treap{
	int ls, rs;
	int size, val, pri;
}t[N];
int q, m, ad;
int cnt;
int rt;
int s, num; 
void newnode(int x){
	cnt++;
	t[cnt].ls = t[cnt].rs = 0;
	t[cnt].size = 1;
	t[cnt].val = x;
	t[cnt].pri = rand();
}
void push_up(int u){
	t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1;
}
void rotate(int &u, int d){
	int k;
	if(d == 0){
		k = t[u].rs;
		t[u].rs = t[k].ls;
		t[k].ls = u;
	}
	else{
		k = t[u].ls;
		t[u].ls = t[k].rs;
		t[k].rs = u;
	}
	t[k].size = t[u].size;
	push_up(u);
	push_up(k);
	u = k;
}
void insert(int &u, int x){
	if(!u){
		newnode(x);
		u = cnt;
		return;
	}
	t[u].size++;
	if(x <= t[u].val) insert(t[u].ls, x);
	else insert(t[u].rs, x);
	if(t[u].ls && t[t[u].ls].pri < t[u].pri) rotate(u, 1);
	if(t[u].rs && t[t[u].rs].pri < t[u].pri) rotate(u, 0);
	push_up(x);
}
void del(int &u, int x){
	if(!u) return; 
	if(t[u].val == x){
		if(!t[u].ls || !t[u].rs){
			u = t[u].ls + t[u].rs;
			return;
		}
		if(t[t[u].ls].pri < t[t[u].rs].pri){
			rotate(u, 1);
			del(t[u].ls, x);
			return;
		}
		else{
			rotate(u, 0);
			del(t[u].rs, x);
			return;
		}
	}
	if(x < t[u].val) del(t[u].ls, x);
	else del(t[u].rs, x);
	push_up(x);
}
int kth(int u, int k){ 
	if(t[t[u].ls].size + 1 == k) return t[u].val;
	else if(k <= t[t[u].ls].size) return kth(t[u].ls, k);
	else return kth(t[u].rs, k - t[t[u].ls].size - 1);
}
int pre(int u, int x){
	if(!u) return 0;
	if(x <= t[u].val) return pre(t[u].ls, x);
	int tmp = pre(t[u].rs, x);
	if(tmp) return tmp;
	else return t[u].val;
}
int main(){
	srand(time(0));
	scanf("%d%d%d", &q, &m);
	while(q--){
		char c;
		int k;
		cin >> c;
		scanf("%d", &k);
		if(c == 'I'){
			if(k - ad >= m){
				insert(rt, k - ad);
				s++;
				num++;
			}
		}
		if(c == 'A'){
			m -= k;
			ad += k;
		}
		if(c == 'S'){
			m += k;
			ad -= k;
			int p = pre(rt, m);
			while(p){
				del(rt, p);
				p = pre(rt, p);
			}
		}
		if(c == 'F'){
			if(k > num) printf("-1\n");
			else{
				printf("%d\n", kth(rt, num - k + 1) + ad);
			}
		}
	}
	printf("%d", s - num); 
	return 0;
}
2025/7/24 10:25
加载中...