# bzoj 1503==noi2003T1郁闷的收纳员——splay

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 100005

using namespace std;

int n,i,m,tot=0,top=0;
char c;

int size[MAX],child[MAX][2],father[MAX],value[MAX],cnt[MAX];
int root=0,num=0;

void rotate(int p)
{
//cout<<"rotate"<<endl;
int q=father[p],y=father[q],x=(child[q][1]==p);
//if p is q's right person then x==1 else x==0
//if x==1 then rotate_left
//else if x==0 then rotate_right
father[child[q][x]=child[p][x^1]]=q;
father[child[p][x^1]=q]=p;
father[p]=y;
if(y)
child[y][child[y][1]==q]=p;
size[q]=cnt[q]+size[child[q][0]]+size[child[q][1]];
size[p]=cnt[p]+size[child[p][0]]+size[child[p][q]];
//pay more attention = = -> the size of p,q should re_calc
}

void splay(int x,int aim=0)
{
//cout<<"splay"<<endl;
for(int y;(y=father[x])!=aim;rotate(x))
if(father[y]!=aim)
{
if((child[y][0]==x)==(child[father[y]][0]==y))
rotate(y);
else
rotate(x);
}
if(aim==0)
root=x;
size[x]=size[child[x][0]]+cnt[x]+size[child[x][1]];
}

void insert(int x,int k)
{
if(!x)
{
num++;
root=num;
x=num;
value[x]=k;
father[x]=0;
child[x][1]=child[x][0]=0;

cnt[x]=1;
size[x]=1;
return;
}
while(x)
{
size[x]++;
if(k==value[x])
{
cnt[x]++;
return;
}
int &y=child[x][k>value[x]];
if(!y)
{
num++;
y=num;
father[y]=x;
child[y][0]=child[y][1]=0;
cnt[y]=size[y]=1;
value[y]=k;
break;
}
x=y;
}
splay(x);
}

int ask(int x,int k)//select
{
k--;
for(;;)
{
if(x==0)
return 0;
if(size[child[x][1]]<=k&&k<cnt[x]+size[child[x][1]])
return x;
if(size[child[x][1]]>k)
x=child[x][1];
else
{
k-=cnt[x]+size[child[x][1]];
x=child[x][0];
}
}
}

int find(int x,int k)//search
{
int Ans=0;
for(;;)
{
if(k<value[x])
if(child[x][0])
{
x=child[x][0];
continue;
}
else
return Ans;
if(k>value[x])
{
if(!Ans||value[x]>value[Ans])
Ans=x;
if(child[x][1])
{
x=child[x][1];
continue;
}
else
return Ans;
}
if(k==value[x])
return x;
}
}

int ans=0;
void delete_(int x)
{
splay(x);
ans+=size[child[root][0]]+cnt[root];
father[root=child[x][1]]=0;
}

void debug()
{
cout<<root<<' '<<value[root]<<' '<<value[child[root][0]]<<' '<<value[child[root][1]]<<endl;
cout<<root<<' '<<size[root]<<' '<<size[child[root][0]]<<' '<<size[child[root][1]]<<endl;
cout<<root<<' '<<cnt[root]<<' '<<cnt[child[root][0]]<<' '<<cnt[child[root][1]]<<endl;
}

int main()
{
cin>>n>>m;
int u=0;
for(i=1;i<=n;i++)
{
int k;
//cin>>c>>k;
getchar();
scanf("%c",&c);
scanf("%d",&k);
//cout<<"++++"<<c<<endl;
switch(c)
{
int temp;
case 'I':
if(k<m)
break;
else
k-=u,tot++,insert(root,k);
break;
case 'A':
u+=k;
break;
case 'S':
u-=k;
temp=find(root,m-u-1);
if(temp)
delete_(temp);
break;
case 'F':
temp=ask(root,k);
if(k>tot-ans)
{
printf("%d\n",-1);
break;
}
//cout<<"temp"<<temp<<endl;
//cout<<"====="<<root<<endl;
//cout<<u<<' ';
printf("%d\n",temp?(u+value[temp]):(-1));
break;
}
}
printf("%d\n",ans);
return 0;
}

• 本文已收录于以下专栏：

## 【BZOJ1503】[NOI2004]郁闷的出纳员【Splay】

【题目链接】 写的心累。。 将A操作看为降低工资底线，将S操作看为升高工资底线。那么这样就不用标记下传了。 另外一开始要加一个inf节点，不能再加个-inf节点，因为会被删掉... 写删除的时候...

## 【splay】【树状数组】 BZOJ 1503 [NOI2004]郁闷的出纳员

/************************************************************** Problem: 1503 User: 70403523...

## BZOJ 1503 [NOI2004] :郁闷的出纳员（Splay）

Description OIER 公司是一家大型专业化软件公司，有着数以万计的员工。作为一名出纳员，我的任务之一便是统计每位员工的工资。这本来是一份不错的工作，但是令人郁闷的是，我们的老板反复无常，...

## bzoj 1503 [NOI2004]郁闷的出纳员 平衡树（treap/Splay）

DescriptionOIER公司是一家大型专业化软件公司，有着数以万计的员工。作为一名出纳员，我的任务之一便是统计每位员工的工资。这本来是一份不错的工作，但是令人郁闷的是，我们的老板反复无常，经常调...

## 【BZOJ1503】【NOI2004】郁闷的出纳员，Splay，调得我整个人都不好了。

NOI2004郁闷的出纳员
• Vmurder
• 2014年10月03日 17:54
• 1094

## 【Splay|Treap】poj3580 SuperMemo && bzoj1503 [noi2004]郁闷的出纳员

splay真的是一种十分耐吃的植物。啃了三四天终于啃熟了 orz  当然现在还仅限于模板题T T 很多东西还是要努力啊！！！ debug的过程真的是十分的艰辛orz 找了毕克大魔王他说叫我再想想QAQ...

## BZOJ 1503 [NOI2004] 郁闷的出纳员 treap

• wzq_QwQ
• 2015年03月20日 13:44
• 1823

## 【bzoj 1503】 [NOI2004]郁闷的出纳员

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 11180  Solved: 3931 [Submit]...
• yyx2000
• 2017年03月05日 22:27
• 88

举报原因： 您举报文章：bzoj 1503==noi2003T1郁闷的收纳员——splay 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)