60ptsWA
查看原帖
60ptsWA
507534
YBaggio楼主2022/4/3 14:46

成绩

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=500010,inf=1000000010;
int n,tot,root,minn;
int sum=0,num=0;
struct Node{
	int lc,rc,val,cnt,size,pri;
	#define lc(x)t[x].lc
	#define rc(x)t[x].rc
	#define v(x)t[x].val
	#define p(x)t[x].pri
	#define c(x)t[x].cnt
	#define s(x)t[x].size
}t[maxn];
int Rand(){
	static long long res=114514;
	return (res*=2333)%inf;
}
void upt(int k){s(k)=s(lc(k))+s(rc(k))+c(k);}
void zig(int &k){
	int y=lc(k);
	lc(k)=rc(y);
	rc(y)=k;
	s(y)=s(k);
	upt(k);k=y;upt(k);
}
void zag(int &k){
	int y=rc(k);
	rc(k)=lc(y);
	lc(y)=k;
	s(y)=s(k);
	upt(k);k=y;upt(k);
}
void insert(int &k,int key){
	if(!k){
		k=++tot;rc(k)=lc(k)=0;
		p(k)=Rand();c(k)=s(k)=1;v(k)=key;
		upt(k);
		return;
	}
	++s(k);
	if(key==c(k))c(k)++;
	else if(key<v(k)){
		insert(lc(k),key);
		if(p(lc(k))<p(k))zig(k);	
	}else{
		insert(rc(k),key);
		if(p(rc(k))<p(k))zag(k);
	}
	return;
}
void del(int &k,int key){
	if(!k)return;
	if(v(k)==key){
		if(c(k)>1)--c(k),--s(k);
		else if(!lc(k)||!rc(k))k=lc(k)+rc(k);
		else if(p(lc(k))<p(rc(k)))zig(k),del(rc(k),key);
		else zag(k),del(lc(k),key);
		upt(k);return;
	}
	if(key<v(k))del(lc(k),key);
	else del(rc(k),key);
	upt(k);return;
}
int qkth(int k){
	int x=root;
	while(x){
		if(s(lc(x))<k&&s(lc(x))+c(x)>=k)return v(x);
		if(s(lc(x))>=k)x=lc(x);	
		else k-=(s(lc(x))+c(x)),x=rc(x); 
	}
	return -1;
}
int pre(int key){
	int x=root,res=-inf;
	while(x){
		if(v(x)==key)return v(x);
		if(v(x)<key)res=v(x),x=rc(x);
		else x=lc(x);
	}
	return res;
}
int nex(int key){
	int x=root,res=inf;
	while(x){
		if(v(x)>key)res=v(x),x=lc(x);
		else x=rc(x);
	}
	return res;
}
int main(){
	//freopen("cashier.in","r",stdin);
//	freopen("cashier.out","w",stdout);
	int s=0,num=0,sum=0;
	scanf("%d%d",&n,&minn);
	for(int i=1;i<=n;i++){
		int x;char opt;
		cin>>opt;scanf("%d",&x);
		if(opt=='I')if(x-sum>=minn)insert(root,x-sum),num++,s++;
		if(opt=='F'){
			if(num<x)printf("-1\n");
			else printf("%d\n",qkth(num-x+1)+sum);
		}
		if(opt=='A')minn-=x,sum+=x;
		if(opt=='S'){
			minn+=x;sum-=x;
			int a=minn-1,b;
			a=pre(a);
			while(pre(a)!=-inf){
				b=a;a=pre(a);
				del(root,pre(b)); 
				num--;
			}
		}
	}
	printf("%d\n",s-num);	
} 
2022/4/3 14:46
加载中...