bzoj1503郁闷的出(cheng)纳(xu)员

好痛苦,,,WA了不知道多少遍

错的服了,,,

如果某员工的初始工资低于工资下界,他将立刻离开公司

我也不知道是我语文有问题还是题目有毒,反正这个东西好像不应该算在离开公司的总人数的答案里。。。

让我一个人静静。。。。

 1 #include <cstdio>
 2 using namespace std;
 3 int son[110001][2],father[110001],size[110001],val[110001],cnt[110001],n,i,now,min,x,y,rt,top,ans,m;
 4 char ch[100];
 5 void newnode(int &x,int fa,int data){
 6     x=++top;
 7     father[x]=fa;
 8     val[x]=data;
 9     size[top]=1;
10     son[x][0]=son[x][1]=0;
11 }
12 void rot(int x,int k){
13     int y=father[x];
14     son[y][!k]=son[x][k];
15     father[son[x][k]]=y;
16     father[x]=father[y];
17     son[father[y]][son[father[y]][1]==y]=x;
18     son[x][k]=y;
19     father[y]=x;
20     size[x]=size[y];
21     size[y]=size[son[y][0]]+size[son[y][1]]+1;
22 }
23 void rots(int x,int g){
24     while((y=father[x])!=g){
25         if(father[father[x]]==g) rot(x,son[father[x]][0] == x);
26         else
27         {
28             int y=father[x],z=father[y],f=(son[z][0]==y);
29             if(son[y][f]==x)rot(x,!f);else rot(y,f);
30             rot(x,f);
31         }
32     }
33     if(!g) rt=x;
34 }
35 void ins(int a){
36     int x=rt;
37     if (!rt){
38         rt=++top;val[rt]=a;
39         son[rt][0]=son[rt][1]=0;
40         size[rt]=1;
41     }
42     else{
43     while(son[x][val[x]<a]) {size[x]++;x=son[x][val[x]<a];}
44     size[x]++;
45     newnode(son[x][val[x]<a],x,a);
46     rots(son[x][val[x]<a],0);
47     }
48 }
49 void del(int a,int x,int fa){
50     if (!x)return;
51     if (val[x]<a){
52         if (x==rt) rt=son[x][1];
53         father[son[x][1]]=fa;
54         son[fa][x==son[fa][1]]=son[x][1];
55         del(a,son[x][1],fa);
56         now+=size[son[x][0]]+1;ans+=size[son[x][0]]+1;
57     }else {del(a,son[x][0],x);}
58     size[x]=size[x]-now;
59 }
60 int find(int k,int x){
61     if(k<=size[son[x][0]])return find(k,son[x][0]);
62     if(k==size[son[x][0]]+1)return val[x]-min+m;
63     return find(k-size[son[x][0]]-1,son[x][1]);
64 }
65 int main(){
66     scanf("%d%d",&n,&m);
67     for (i=1;i<=n;i++){
68         scanf("%s%d",&ch,&x);
69         if (ch[0]=='I')if (x>=m)ins(x-m+min);
70         if (ch[0]=='A')min-=x;
71         if (ch[0]=='S'){min+=x;now=0;del(min,rt,0);}
72         if (ch[0]=='F')if (x>size[rt]) printf("-1\n");else printf("%d\n",find(size[rt]-x+1,rt));
73     }
74     printf("%d\n",ans);
75 }

被卡题意的感觉爽翻了。。。

posted @ 2016-09-29 20:51  汪立超  阅读(193)  评论(0编辑  收藏  举报