如果你用FHQ-Treap 但只AC #6

P1486 [NOI2004] 郁闷的出纳员

```cpp #include<bits/stdc++.h> //#define int long long using namespace std; const int N=3e5+10; int n,minx,ans; struct node{ int l,r,key,val,size; }tr[N<<1]; int root,idx; int x,y,z; void update(int p){ tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1; } int get_node(int key){ tr[++idx].key=key; tr[idx].val=rand(); tr[idx].size=1; return idx; } void split(int p,int key,int &x,int &y){ if(!p)x=y=0; else{ if(tr[p].key<=key){ x=p; split(tr[p].r,key,tr[p].r,y); }else{ y=p; split(tr[p].l,key,x,tr[p].l); } update(p); } } int merge(int x,int y){ if(!x||!y)return x+y; if(tr[x].val>tr[y].val){ tr[x].r=merge(tr[x].r,y); update(x); return x; }else{ tr[y].l=merge(x,tr[y].l); update(y); return y; } } void insert(int key){ split(root,key,x,y); root=merge(merge(x,get_node(key)),y); } void del(int key){ ans++; split(root,key,x,z); split(x,key-1,x,y); y=merge(tr[y].l,tr[y].r); root=merge(merge(x,y),z); //update(root); } int get_prev(int key){ split(root,key-1,x,y); int p=x; if(!p){ return 0; } while(tr[p].r) p=tr[p].r; key=tr[p].key; root=merge(x,y); return key; } int get_key(int rank){ int p=root; while(p){ if(tr[tr[p].l].size+1==rank){ break; } else if(tr[tr[p].l].size>=rank) p=tr[p].l; else{ rank-=tr[tr[p].l].size+1; p=tr[p].r; } } return tr[p].key; } int main(){ srand(time(0)); int ex=0; cin>>n>>minx; char op; for(int i=1,t;i<=n;i++){ cin>>op; cin>>t; if(op=='I'){ if(t+ex<minx)continue; insert(t+ex); }else if(op=='A'){ minx-=t; ex-=t; }else if(op=='S'){ minx+=t,ex+=t; int temp=get_prev(minx); while(temp){ del(temp); temp=get_prev(minx); } }else if(op=='F'){ int temp=get_prev(minx); while(temp){ del(temp); temp=get_prev(minx); } if(t>tr[root].size){ cout<<-1<<endl; }else{ update(root);cout<<get_key(tr[root].size-t+1)-ex<<endl; } } } cout<<ans; } ``` 我就#6wa了。。。。
by CyberPrisoner @ 2023-07-20 14:24:19


|