全WA /qd /qd
查看原帖
全WA /qd /qd
1248522
mlvx楼主2024/8/4 19:45

基本都WA在几千几万行

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,inf=2e9;
int q,MIN,sum,Cnt,now,tot,rt,val[N],dat[N],cnt[N],siz[N],son[N][2];char op;
int add(int v){return++tot,val[tot]=v,dat[tot]=rand(),cnt[tot]=siz[tot]=1,tot;}
void push_up(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
void build(){son[rt=add(-inf)][1]=add(inf),push_up(rt);}
void rotate(int&x,int d){int tmp=son[x][d^1];son[x][d^1]=son[tmp][d],son[tmp][d]=x,x=tmp,push_up(son[x][d]),push_up(x);}
void insert(int&x,int v){
	if(!x)return x=add(v),void();
	if(v==val[x])return ++cnt[x],push_up(x);
	int d=v<val[x]?0:1;insert(son[x][d],v),dat[x]<dat[son[x][d]]&&(rotate(x,d^1),1),push_up(x);
}void romove(int&x,int v){
	if(!x)return;
	if(v==val[x]){
		if(cnt[x]>1)return--cnt[x],push_up(x);
		if(son[x][0]||son[x][1])!son[x][1]||dat[son[x][0]]>dat[son[x][1]]?(rotate(x,1),romove(son[x][1],v),1):(rotate(x,0),romove(son[x][0],v),1),push_up(x);
		else x=0;
	}else v<val[x]?(romove(son[x][0],v),1):(romove(son[x][1],v),1),push_up(x);
}int getrank(int x,int v){
	if(!x)return 1;
	if(v==val[x])return siz[son[x][0]]+1;
	return v<val[x]?getrank(son[x][0],v):getrank(son[x][1],v)+siz[son[x][0]]+cnt[x];
}int getval(int x,int rk){
	if(!x)return inf;
	if(rk<=siz[son[x][0]])return getval(son[x][0],rk);
	if(rk<=siz[son[x][0]]+cnt[x])return val[x];
	return getval(son[x][1],rk-siz[son[x][0]]-cnt[x]);
}int getlast(int v){
	int x=rt,ret;
	while(x)v>val[x]?(ret=val[x],x=son[x][1]):x=son[x][0];
	return ret;
}int getnext(int v){
	int x=rt,ret;
	while(x)v<val[x]?(ret=val[x],x=son[x][0]):x=son[x][1];
	return ret;
}int main(){
	build(),cin>>q>>MIN;
	for(int x;q--;){
		cin>>op>>x;
		if(op=='I')x-sum>=MIN&&(insert(rt,x-sum),++now);
		if(op=='A')MIN-=x,sum+=x;
		if(op=='S'){
			MIN+=x,sum-=x;
			int qwq=MIN-1;
			while(getlast(qwq)!=-inf)romove(rt,qwq=getlast(qwq)),--now,++Cnt;
		}if(op=='F')cout<<(x>now?-1:getval(rt,now-x+2)+sum)<<'\n';
	}return cout<<Cnt,0;
}
2024/8/4 19:45
加载中...