Time Limit:10000MS Memory Limit:65536K Description OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 Input 第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。 Output 输出文件的行数为F命令的条数加一。 Sample Input
9 10
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
Sample Output
10
20
-1
2
Hint I命令的条数不超过100000 Source xinyue |
题目:http://mail.bashu.cn:8080/bs_oj/showproblem?problem_id=1482
题意:作为一个管理员工工资的人,调整员工工资记录,每次可能加入新员工,或增加减少所有员工工资,或询问第k多的工资是。。。还有一个界限,工资低于界限的员工将会离开,刚进来就低于这个界限的直接不进来,并且不算进离开的员工
分析:所有的操作都比较简单,而对于调整工资,就必须思考下,不过也简单,直接变成调整界限,和新来员工工资即可,剩下的就是splay。。。
PS:原本以为不会出现工资相同的,结果因为调整了新来的员工的工资,所以可能相同,这导致了我wa了。。。还好我又数据,偷懒只保证了AC
还有我的代码效率太低了T_T
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int mm=111111;
const int oo=2e9;
struct SplayTree
{
int son[mm][2],far[mm],val[mm],sum[mm];
int rt,size;
void PushUp(int x)
{
sum[x]=sum[son[x][0]]+sum[son[x][1]]+1;
}
void Link(int x,int y,int c)
{
far[x]=y,son[y][c]=x;
}
void Rotate(int x,int c)
{
int y=far[x];
Link(x,far[y],son[far[y]][1]==y);
Link(son[x][!c],y,c);
Link(y,x,!c);
PushUp(y);
}
void Splay(int x,int g)
{
for(;far[x]!=g;)
{
int y=far[x],cx=son[y][1]==x,cy=son[far[y]][1]==y;
if(far[y]==g)Rotate(x,cx);
else
{
if(cx==cy)Rotate(y,cy);
else Rotate(x,cx);
Rotate(x,cy);
}
}
PushUp(x);
if(!g)rt=x;
}
void NewNode(int y,int &x,int a)
{
x=++size;
far[x]=y,val[x]=a,sum[x]=1;
son[x][0]=son[x][1]=0;
}
void Insert(int a)
{
int x=rt;
while(son[x][val[x]<a])x=son[x][val[x]<a];
NewNode(x,son[x][val[x]<a],a);
Splay(size,0);
}
void Prepare()
{
NewNode(size=0,rt,-oo);
NewNode(rt,son[rt][1],oo);
sum[rt]=2;
}
int Suc(int a)
{
int x=rt,ret=oo;
while(x)
{
if(val[x]==a)return a;
if(val[x]>a)ret=min(ret,val[x]);
x=son[x][val[x]<a];
}
return ret;
}
int Find(int a)
{
int x=rt,ret=0;
while(x)
{
if(val[x]==a)ret=x;
x=son[x][val[x]<a];
}
return ret;
}
int Select(int k,int g)
{
int x=rt;
while(sum[son[x][1]]!=k)
{
if(sum[son[x][1]]>k)x=son[x][1];
else k-=(sum[son[x][1]]+1),x=son[x][0];
}
Splay(x,g);
return val[x];
}
int DeleteBelow(int a)
{
int x=Find(a),ret=0;
if(x)
{
Splay(1,0);
Splay(x,1);
ret=sum[son[x][0]];
son[x][0]=0;
Splay(x,0);
}
return ret;
}
}spt;
int a,w,n,m,ans;
char op[9];
int main()
{
while(~scanf("%d%d",&n,&m))
{
spt.Prepare();
ans=w=0;
while(n--)
{
scanf("%s%d",op,&a);
if(op[0]=='I')
{
a-=w;
if(a>=m-w)spt.Insert(a);
}
if(op[0]=='A')w+=a;
if(op[0]=='S')
{
w-=a;
ans+=spt.DeleteBelow(spt.Suc(m-w));
}
if(op[0]=='F')
if(spt.sum[spt.rt]<a+2)puts("-1");
else printf("%d\n",spt.Select(a,0)+w);
}
printf("%d\n",ans);
}
return 0;
}