求助 P1486 郁闷的出纳员 treap
查看原帖
求助 P1486 郁闷的出纳员 treap
444236
Lesiris楼主2023/9/10 20:59
#include<bits/stdc++.h>
using namespace std;
const int N=10e5,INF=1e9;
int nnnnn,ans,gg[N],g[N],sz[N],key[N],cnt[N],sn[N][2],rd[N],k,x,n,tot,minn,nn;
char opt;
inline void push_up(int k)
{
	sz[k]=sz[sn[k][0]]+sz[sn[k][1]]+cnt[k];
}
inline void rotate(int &k,int d)
{
	int k1=sn[k][d^1];
	sn[k][d^1]=sn[k1][d];
	sn[k1][d]=k;
	push_up(k); 
	push_up(k1);
	k=k1;
}
void insert(int &k,int x)
{
	if(!k)
	{
		k=++tot;
		sz[k]=cnt[k]=1;
		key[k]=x;
		rd[k]=rand();
		return;
	}
	if(key[k]==x)
	{
		sz[k]++;
		cnt[k]++;
		return;
	}
	int d=x>key[k];
	insert(sn[k][d],x);
	if(rd[k]<rd[sn[k][d]]) rotate(k,d^1);
	push_up(k);
}
void del(int &k,int x)
{
	if(!k) return;
	if(x!=key[k]) del(sn[k][x>key[k]],x);
	else
	{
		if(cnt[k]>1)
		{
			cnt[k]--; 
			sz[k]--; 
			return;
		}
		else if(!sz[sn[k][0]]&&!sz[sn[k][1]])
		{
			cnt[k]--;
			sz[k]--;
			k=0;
			return;
		}
		else
		{
			int d;
			if(sz[sn[k][0]]*sz[sn[k][1]])
			{
				d=rd[sn[k][0]]>rd[sn[k][1]];
			}
			else d=sz[sn[k][0]]>=1;
			rotate(k,d);
			del(sn[k][d],x);
		}
	}
	push_up(k);
}
int get_rnk(int k, int x)
{
	if(!k) return 1;
	if(key[k]==x) return sz[sn[k][0]]+1;
	if(key[k]>x) return get_rnk(sn[k][0],x);
	return sz[sn[k][0]]+cnt[k]+get_rnk(sn[k][1],x);
}
int get_val(int k, int x)
{
	if(!k) return 0;
	if(sz[sn[k][0]]>=x) return get_val(sn[k][0],x);
	else if(sz[sn[k][0]]+cnt[k]>=x) return key[k];
	return get_val(sn[k][1],x-sz[sn[k][0]]-cnt[k]);
}
int get_pre(int k, int x)
{
	if(!k) return -INF;
	if(key[k]>=x) return get_pre(sn[k][0],x);
	return max(key[k],get_pre(sn[k][1],x));
}
int get_suf(int k, int x)
{
	if(!k) return (1<<30);
	if(key[k]<=x) return get_suf(sn[k][1],x);
	return min(key[k],get_suf(sn[k][0],x));
}
inline long long read()
{
    long long x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
	{
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
	{
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
void jc()
{
	for(int i=1;i<=tot;i++)
	{
		cout<<key[i]<<" ";
	}
	cout<<endl;
}
void add(long long x)
{
	for(int i=1;i<=tot;i++)
	{
		if(!g[i]) key[i]+=x;
	
	}
	for(int i=1;i<=tot;i++)
	{
		//if(!g[i]) key[i]+=x;
		if(key[i]<minn&&!g[i])
		{
			del(k,i);	
			g[i]++;
			nn--;
			ans++;
		}
	
	}
}
void add2(long long x)
{
	for(int i=1;i<=nnnnn;i++)
	{
		if(!g[i]) key[i]+=x;
		if(key[i]<minn&&!g[i])
		{
			del(k,i);	
			g[i]++;
			nn--;
			ans++;
		}
	}
	
}
int main()
{
	srand(1024);
	n=read(),minn=read();
	for(int i=1;i<=n;i++)
	{
	//	jc();
		cin>>opt;
		x=read();
		if(opt=='I')
		{
			if(x>=minn)
			{
				nn++; 
				nnnnn++;
				insert(k,x);
			}
		}
		if(opt=='A')
		{
			add2(x);
		}
		if(opt=='S')
		{
			add2(-x);
		}
		if(opt=='F')
		{
			long long xxx=get_val(k,nnnnn-x+1);
			if(x>nn) xxx=-1;
			printf("%d\n",xxx);
		}
	}
	printf("%d\n",ans);
	return 0;
}
2023/9/10 20:59
加载中...