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; }