萌新求教,样例过了实测全T

P1486 [NOI2004] 郁闷的出纳员

```cpp #include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;++i) #define ls(rt) T[rt].lc #define rs(rt) T[rt].rc using namespace std; const int N=1e5+5; const int INF=0x3f3f3f3f; struct node{ int val,rnk,lc,rc,sz; }T[N]; int n,minn,tot=0,tag=0,ans=0; int add(int val){ T[++tot].val=val; ls(tot)=rs(tot)=0; T[tot].sz=1; T[tot].rnk=rand(); return tot; } void update(int rt){T[rt].sz=T[ls(rt)].sz+T[rs(rt)].sz+1;} void split(int rt,int &a,int &b,int val){ if(!rt){ a=b=0; return; } if(T[rt].val<=val){ a=rt; split(rs(rt),rs(a),b,val); } else { b=rt; split(ls(rt),a,ls(b),val); } update(rt); } void merge(int &rt,int a,int b){ if(a==0||b==0){ rt=a+b; return; } if(T[a].rnk<T[b].rnk){ rt=a; merge(rs(rt),rs(a),b); } else { rt=b; merge(ls(rt),a,ls(b)); } update(rt); } int kth(int rt,int k){ while(T[ls(rt)].sz+1!=k){ if(k<T[ls(rt)].sz+1)rt=ls(rt); else rt=rs(rt),k-=T[ls(rt)].sz+1; } return T[rt].val; } void insert(int &rt,int val){ int x=0,y=0,newnode=add(val); split(rt,x,y,val); merge(x,x,newnode); merge(rt,x,y); } void delk(int &rt,int val){ int x=0,y=0; split(rt,x,y,val-1); rt=y; ans+=T[x].sz; //printf("debug:T[x].sz = %d\n",T[x].sz); } int main(){ int root=0; srand(19260817); insert(root,INF); scanf("%d%d",&n,&minn); char cmd[5]; int kkk; rep(i,1,n){ scanf("%s%d",cmd,&kkk); if(cmd[0]=='I'){ if(kkk>=minn){ insert(root,kkk-tag); } } if(cmd[0]=='A')tag+=kkk; if(cmd[0]=='S'){ tag-=kkk; delk(root,minn-tag); } if(cmd[0]=='F'){ if(kkk<=T[root].sz-1)printf("%d\n",kth(root,T[root].sz-kkk)+tag); else printf("-1\n"); } } printf("%d",ans); return 0; } ```
by henrytb @ 2019-08-08 20:19:38


|