fhq-treap 30pts 求助 玄关
查看原帖
fhq-treap 30pts 求助 玄关
663195
Z_AuTwT楼主2024/7/2 11:38

#9 MLE

#2、#5~#8、#10 RE

#include<bits/stdc++.h>
using namespace std;
struct Tree{
	int cnt,ROOT,X,Y,Z;
	int L[300010],R[300010],Size[300010],Key[300010],value[300010];
	void update(int k){
		Size[k]=Size[L[k]]+Size[R[k]]+1;
	}
	void spilt(int Root,int Value,int &x,int &y){
		if(!Root){
			x=y=0;
			return;
		}
		if(value[Root]<=Value){
			x=Root;
			spilt(R[Root],Value,R[Root],y);
		}else{
			y=Root;
			spilt(L[Root],Value,x,L[Root]);
		}
		update(Root);
	}
	int merge(int x,int y){
		if(!x||!y) return x+y;
		if(Key[x]>Key[y]){
			R[x]=merge(R[x],y);
			update(x);
			return x;
		}else{
			L[y]=merge(x,L[y]);
			update(y);
			return y;
		}
	}
	int New(int Value){
		cnt++;
		value[cnt]=Value;
		Size[cnt]=1;
		Key[cnt]=rand();
		return cnt;
	}
	void insert(int Value){
		Z=New(Value);
		spilt(ROOT,Value,X,Y);
		ROOT=merge(merge(X,Z),Y);
	}
	void Del(int Value){
		spilt(ROOT,Value,X,Z);
		spilt(X,Value-1,X,Y);
		Y=merge(L[Y],R[Y]);
		ROOT=merge(merge(X,Y),Z);
	}
	int Get_rk(int Value){
		spilt(ROOT,Value-1,X,Y);
		int res=Size[X]+1;
		ROOT=merge(X,Y);
		return res;
	}
	int Get_value(int rk){
		int RT=ROOT;
		while(RT){
			if(Size[L[RT]]+1==rk){
				break;
			}
			if(Size[L[RT]]>=rk){
				RT=L[RT];
			}else{
				rk-=(Size[L[RT]]+1);
				RT=R[RT];
			}
		}
		return value[RT];
	}
	int pre(int v){
		return Get_value(Get_rk(v)-1);
	}
	int nxt(int v){
		return Get_value(Get_rk(v+1));
	}
}tr;
int n,Min,cnt,Cnt,Sum;
int x;
void Work_I(){
	if(x>=Min){
		Cnt++;
		tr.insert(x);
	}
	return;
}
int Vdt[300010];
void Work_A(){
	for(int i=1;i<=Cnt;i++){
		Vdt[i]=tr.Get_value(i);
	}
    for(int i=1;i<=Cnt;i++){
        tr.Del(Vdt[i]);
		tr.insert(Vdt[i]+x);
    }
}
void Work_S(){
	int Dt1=0;
	for(int i=1;i<=Cnt;i++){
		Vdt[i]=tr.Get_value(i);
	}
    for(int i=1;i<=Cnt;i++){
        if(Vdt[i]-x<Min){
            tr.Del(Vdt[i]);
            cnt++;
            Dt1++;
        }else{
            tr.Del(Vdt[i]);
			tr.insert(Vdt[i]-x);
        }
    }
	Cnt-=Dt1;
	return;
}
int Work_F(){
	return tr.Get_value(Cnt-x+1);
}
main(){
//	freopen("P1486_2.in","r",stdin);
//	freopen("P1486_2.ans","w",stdout);
	cin>>n>>Min;
	for(int i=1;i<=n;i++){
		char op;
		cin>>op>>x;
		if(op=='I') Work_I();
		if(op=='A') Work_A();
		if(op=='S') Work_S();
		if(op=='F') cout<<(x>Cnt?-1:Work_F())<<"\n";
	}
	cout<<cnt;
}
2024/7/2 11:38
加载中...