1482 -- 【NOI2004】郁闷的出纳员
Description
OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。
工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。
老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。
好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?
工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。
老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。
好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?
Input
第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。
接下来的n行,每行表示一条命令。命令可以是以下四种之一:
_(下划线)表示一个空格,I命令、A命令、S命令中的k是一个非负整数,F命令中的k是一个正整数。
在初始时,可以认为公司里一个员工也没有
接下来的n行,每行表示一条命令。命令可以是以下四种之一:
_(下划线)表示一个空格,I命令、A命令、S命令中的k是一个非负整数,F命令中的k是一个正整数。
在初始时,可以认为公司里一个员工也没有
Output
输出文件的行数为F命令的条数加一。
对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。
输出文件的最后一行包含一个整数,为离开公司的员工的总数。
对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。
输出文件的最后一行包含一个整数,为离开公司的员工的总数。
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
A命令和S命令的总条数不超过100
F命令的条数不超过100000
每次工资调整的调整量不超过1000
新员工的工资不超过100000
A命令和S命令的总条数不超过100
F命令的条数不超过100000
每次工资调整的调整量不超过1000
新员工的工资不超过100000
把一个变量用作类似线段树中的延迟标记,不需要在每次加或者减的时候进行全部更新。在后来插入的结点中,应该当之前的延迟算进去,如果初始就小于下限的不添加,而且也不算作最后离开的人数。
在删除的时候,如果根结点小于下限,说明左子树以及根结点都小于下限,直接把右子树作为根。对新的树进行处理。
如果根结点大于下限,说明右子树也全部大于下限,对左子树进行处理,最后更新根的size。(FROM cxlove)
#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> using namespace std; const int M=100000+5; struct data{ int l,r,num,pro,s; }t[M]; int n,minn; int rt,tot,cnt,delta; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} return x*f; } void update(int p) { t[p].s=t[t[p].l].s+t[t[p].r].s+1; } void Zig(int &p) { int k=t[p].r; t[p].r=t[k].l; t[k].l=p; t[k].s=t[p].s;//整棵子树的大小没有改变,只是根节点变换 update(p); p=k;//根节点改为k } void Zag(int &p) { int k=t[p].l; t[p].l=t[k].r; t[k].r=p; t[k].s=t[p].s; update(p); p=k; } void Insert(int &p,int x) { if(p==0) { tot++;p=tot; t[p].pro=rand(); t[p].num=x; t[p].s=1; return; } t[p].s++; if(x<t[p].num) { Insert(t[p].l,x); if(t[t[p].l].pro<t[p].pro) Zag(p); } else { Insert(t[p].r,x); if(t[t[p].r].pro<t[p].pro) Zig(p); } } int Del(int &p,int x) { int k;//记录上层递归删除节点数 if(!p) return 0; if(x<=t[p].num)//一定要加= { k=Del(t[p].l,x); t[p].s-=k; return k; } else { k=t[t[p].l].s+1; p=t[p].r; return k+Del(p,x); } } int Findk(int p,int k) { if(t[t[p].l].s+1==k) return t[p].num+delta; else if(t[t[p].l].s+1<k) return Findk(t[p].r,k-t[t[p].l].s-1);//减去的1是根节点 else return Findk(t[p].l,k); } int main() { char ch[1]; int x; rt=0;tot=0;cnt=0; // srand(1); n=read();minn=read(); while(n--) { scanf("%s%d",ch,&x);//不要加& if(ch[0]=='I') if(x>=minn) Insert(rt,x-delta); if(ch[0]=='A') delta+=x; if(ch[0]=='S') { delta-=x; cnt+=Del(rt,minn-delta); } if(ch[0]=='F') { if(x>t[rt].s) puts("-1"); else printf("%d\n",Findk(rt,t[rt].s-x+1)); } } printf("%d\n",cnt); return 0; }
treap模板已写熟,向SBT迈进
各种写法提交了n次..%%%Gvv
1482 | sdfzgww | Accepted | 100 | 466 ms | 4243 KB | 2.24 KB | G++(0x) | 2015-11-16 23:45:57 | |
564586 | 1482 | sdfzgww | Accepted | 100 | 484 ms | 6977 KB | 2.24 KB | G++(0x) | 2015-11-16 23:44:47 |
564581 | 1482 | sdfzgww | Accepted | 100 | 495 ms | 28852 KB | 2.09 KB | G++(0x) | 2015-11-16 23:11:42 |
567659 | 1482 | sdfz_ZWR | Accepted | 100 | 505 ms | 16521 KB | 3.77 KB | G++ | 2015-12-04 22:58:46 |
567502 | 1482 | sdfz_ZWR | Accepted | 100 | 521 ms | 3067 KB | 2.85 KB | G++ | 2015-12-04 17:59:40 |
512770 | 1482 | liuyunhui123 | Accepted | 100 | 533 ms | 3239 KB | 2.76 KB | G++ | 2015-05-26 16:24:59 |
567660 | 1482 | sdfz_ZWR | Accepted | 100 | 535 ms | 3068 KB | 2.09 KB | G++ | 2015-12-04 23:21:18 |
567475 | 1482 | SDFZ_YSM | Accepted | 100 | 577 ms | 5995 KB | 1.81 KB | G++ | 2015-12-04 16:59:36 |
348989 | 1482 | cqtest | Accepted | 100 | 580 ms | 6038 KB | 3.36 KB | G++(0x) | 2012-12-01 08:33:28 |
459755 | 1482 | sxrjl | Accepted | 100 | 591 ms | 20881 KB | 2.32 KB | G++ | 2014-09-06 16:39:03 |
567429 | 1482 | sdfz_ZWR | Accepted | 100 | 596 ms | 3461 KB | 1.8 KB | G++ | 2015-12-03 15:31:51 |