treap 90 WA on #6求助
查看原帖
treap 90 WA on #6求助
310624
Crying楼主2023/11/12 16:15
#include<bits/stdc++.h>
#define N 1000060
using namespace std;
int n,minn,min2,sm,lev,o,rt,cct,ls[N],rs[N],val[N],cnt,w[N],rnd[N],siz[N];
int rd(){
	int x=0,y=1;char c=getchar();
	while(!isdigit(c)){ if(c=='-') y=-y;c=getchar();	}
	while(isdigit(c)){ x=(x<<3)+(x<<1)+c-'0';c=getchar();	}
	return x*y;
}
void zig(int &x){
	int lch=ls[x];
	ls[x]=rs[lch];	rs[lch]=x;
	siz[lch]=siz[x];	siz[x]=w[x]+siz[ls[x]]+siz[rs[x]];
	x=lch;
}
void zag(int &x){
	int rch=rs[x];
	rs[x]=ls[rch];ls[rch]=x;
	siz[rch]=siz[x]; siz[x]=w[x]+siz[ls[x]]+siz[rs[x]];
	x=rch;
}
void inst(int &x,int v){
	if(!x){
		x=++cnt;w[x]=siz[x]=1;val[x]=v;
		rnd[x]=rand();
		return;
	}
	siz[x]++;
	if(v==val[x]){ w[x]++;return ;	}
	if(v<val[x]){
		inst(ls[x],v);
		if(rnd[ls[x]]<rnd[x]) zig(x);
		return;
 	}
 	if(v>val[x]){
		inst(rs[x],v);
		if(rnd[rs[x]]<rnd[x]) zag(x);
		return;
 	}
}
bool dlt(int &x,int v){
	if(!x) return false;
	if(v<val[x]){
		bool ok=dlt(ls[x],v);
		if(ok) siz[x]--;
		return ok;
	}
	if(v>val[x]){
		bool ok=dlt(rs[x],v);
		if(ok) siz[x]--;
		return ok;
	}
	if(w[x]>1){ w[x]-=1;siz[x]--;return true;	}
	if(ls[x]==0||rs[x]==0){ x=ls[x]+rs[x];return true;	}
	if(rnd[ls[x]]<rnd[x]){
		zig(x);return dlt(x,v);
	}
	zag(x);return dlt(x,v);
}
void qypr(int x,int v){
	if(!x) { return;	}
	if(val[x]<v) o=val[x],qypr(rs[x],v);
	if(val[x]>=v) qypr(ls[x],v);
}
int qyrnk(int x,int v){
	if(siz[ls[x]]+1<=v&&v<=siz[ls[x]]+w[x]) return val[x];
	if(siz[ls[x]]+1>v) return qyrnk(ls[x],v);
	if(v>siz[ls[x]]+w[x]) return qyrnk(rs[x],v-siz[ls[x]]-w[x]);
}
int main(){
	srand(123);
	n=rd();minn=min2=rd();
	for(int i=1;i<=n;i++){
		char c=getchar();int k;
		while(c!='I'&&c!='A'&&c!='S'&&c!='F') c=getchar();
		if(c=='I'){
			k=rd();if(k-sm<minn) continue;
			inst(rt,k-sm);cct++;
		}
		if(c=='A') k=rd(),sm+=k,minn-=k;
		if(c=='S'){
			k=rd();sm-=k;minn+=k;
			while(1){
			    o=0;
				qypr(rt,minn);
				if(!o) break;
				dlt(rt,o);lev++;cct--;
			}
		}
		if(c=='F') {
			k=rd();
			
			if(k>cct) printf("-1\n");
			else printf("%d\n",qyrnk(rt,cct-k+1)+sm);
		}
	}
	cout<<lev;
	return 0;
}
2023/11/12 16:15
加载中...