BZOJ 1503 treap
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 1503 treap
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:
treap (算是基本操作吧…..)
加減的操作數很少 就暴力好啦
每回判斷一下最小的數是不是比M小
如果是 就刪,繼續判斷
搞定。
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,M,xx,size,root,jy,ans; char op[3]; struct Treap{int ch[2],rnd,cnt,sz,v;}tr[300050]; void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;} void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;} void insert(int &k,int num){if(!k){k=++size;tr[k].sz=tr[k].cnt=1,tr[k].v=num,tr[k].rnd=rand();return;}tr[k].sz++;if(tr[k].v==num){tr[k].cnt++;return;}bool f=num>tr[k].v;insert(tr[k].ch[f],num);if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f); } void dfs(int k,int num){tr[k].v+=num;if(tr[k].ch[0])dfs(tr[k].ch[0],num);if(tr[k].ch[1])dfs(tr[k].ch[1],num); } int rank(int k,int num){if(tr[tr[k].ch[1]].sz>=num)return rank(tr[k].ch[1],num); else if(tr[tr[k].ch[1]].sz+tr[k].cnt>=num)return tr[k].v;else return rank(tr[k].ch[0],num-tr[tr[k].ch[1]].sz-tr[k].cnt); } int get_min(int k){if(tr[k].ch[0])return get_min(tr[k].ch[0]);return tr[k].v; } void del(int &k,int num){if(tr[k].v==num){if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;else if(tr[k].ch[0]*tr[k].ch[1]==0)k=max(tr[k].ch[0],tr[k].ch[1]);else rot(k,tr[tr[k].ch[0]].rnd>tr[tr[k].ch[1]].rnd),del(k,num);}else tr[k].sz--,del(tr[k].ch[num>tr[k].v],num); } int main(){scanf("%d%d",&n,&M);for(int i=1;i<=n;i++){scanf("%s%d",op,&xx);if(op[0]=='I'){if(xx>=M)insert(root,xx);}else if(op[0]=='S')dfs(root,-xx);else if(op[0]=='A')dfs(root,xx);else {if(xx<=tr[root].sz)printf("%d\n",rank(root,xx));else puts("-1");}while(tr[root].sz&&(jy=get_min(root))<M)ans++,del(root,jy);}printf("%d\n",ans); }轉載于:https://www.cnblogs.com/SiriusRen/p/6532155.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的BZOJ 1503 treap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery生成二维码
- 下一篇: php随机数、时间、字符串函数,正则,数