RE求调
查看原帖
RE求调
920947
yrteop_maerD楼主2025/6/15 19:53

大部分 RE,还有三个 TLE,求调/kel。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=1e14;

int n,m;

int res;
int ans;

struct node{
	int val;
	int r;
	int siz;
	int num;
}tree[1000005];

int cnt;

int son[1000005][2];
int R;

inline void update(int p){
	tree[p].siz=tree[p].num+tree[son[p][0]].siz+tree[son[p][1]].siz;
}

inline void spin(int &p,int op){
	int v=son[p][op^1];
	son[p][op^1]=son[v][op];
	son[v][op]=p;
	update(p);
	update(v);
	p=v;
}



inline void insert(int &p,int x){
	if (!p){
		p=++cnt;
		tree[p].val=x;
		tree[p].siz=1;
		tree[p].num=1;
		tree[p].r=rand();
	}
	else if (tree[p].val==x){
		tree[p].num++;
	}
	else if (tree[p].val<x){
		insert(son[p][1],x);
		if (tree[p].r<tree[son[p][1]].r){
			spin(p,0);
		}
	}
	else{
		insert(son[p][0],x);
		if (tree[p].r<tree[son[p][1]].r){
			spin(p,1);
		}
	}
	update(p);
}

inline int del(int &p,int x){
	if (!p){
		return -1;
	}
	if (tree[p].val<x){
		del(son[p][1],x);
	}
	else if (tree[p].val>x){
		del(son[p][0],x);
	}
	else{
		if (!son[p][1] && !son[p][0]){
			res-=tree[p].num;
			tree[p].num=0;
			tree[p].siz=0;
			p=0;
		}
		else if (!son[p][1] && son[p][0]){
			spin(p,1);
			del(son[p][1],x);
		}
		else if (son[p][1] && !son[p][0]){
			spin(p,0);
			del(son[p][0],x);
		}
		else{
			if (tree[son[p][0]].r<tree[son[p][1]].r){
				spin(p,1);
				del(son[p][1],x);
			}	
			else{
				spin(p,0);
				del(son[p][0],x);
			}
		}
	}
	update(p);
}


inline int fro(int p,int x){
	if (!p){
		return -inf;
	}
	int ans=-inf;
	while (p){
		if (tree[p].val<x){
			ans=max(tree[p].val,ans);
			p=son[p][1];
		}
		else{
			p=son[p][0];
		}
	}
	return ans;
}

inline int find(int p,int x){
	if (!p){
		return -inf;
	}
	if (tree[son[p][0]].siz>=x){
		return find(son[p][0],x);
	}
	else if (tree[son[p][0]].siz+tree[p].num<x){
		return find(son[p][1],x-tree[p].num-tree[son[p][0]].siz);
	}
	else{
		return tree[p].val;
	}
}


signed main(){
	cin>>n>>m;
	insert(R,-inf);
	insert(R,inf);
	int cg=0;
	while (n--){
		char op;
		int k;
		cin>>op>>k;
		if (op=='I'){
			if (k-cg>=m){
				insert(R,k-cg);
				res++;
				ans++;	
			}
		}
		else if (op=='A'){
			m-=k;
			cg+=k;
		}
		else if (op=='S'){
			m+=k;
			cg-=k;
			while (fro(R,m)!=-inf){
				int id=fro(R,m);
				del(R,id);
			}
		}
		else{
			if (res<k){
				cout<<"-1\n";
			}
			else{
				cout<<find(R,res-k+2)+cg<<endl;
			}
		}
	}	
	cout<<ans-res;
	return 0;
}
2025/6/15 19:53
加载中...