标签:cnt return val int updata Treap T105331 模板 size
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int SIZE=100010; struct Treap{ int l,r; int val,dat; int size,cnt; }a[SIZE]; int n,root,tot,INF=0x7fffffff; int New(int val){ a[++tot].val=val; a[tot].dat=rand(); a[tot].size=a[tot].cnt=1; return tot; } void updata(int p){ a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt; } void build(){ New(-INF),New(INF); root=1,a[1].r=2; updata(1); } void zig(int &p){ int q=a[p].l; a[p].l=a[q].r,a[q].r=p,p=q; updata(p),updata(a[p].r); } void zag(int &p){ int q=a[p].r; a[p].r=a[q].l,a[q].l=p,p=q; updata(p),updata(a[p].l); } int getRankByVal(int p,int val){ if(a[p].val==val)return a[a[p].l].size+1; if(a[p].val>val)return getRankByVal(a[p].l,val); return getRankByVal(a[p].r,val)+a[a[p].l].size+a[p].cnt; } int getValByRank(int p,int rank){ if(a[a[p].l].size>=rank)return getValByRank(a[p].l,rank); if(a[a[p].l].size+a[p].cnt>=rank)return a[p].val; return getValByRank(a[p].r,rank-a[a[p].l].size-a[p].cnt); } void add(int &p,int val){ if(p==0){ p=New(val),updata(p); return; } if(a[p].val==val){ a[p].cnt++,updata(p); return; } if(a[p].val>val){ add(a[p].l,val),updata(p); if(a[a[p].l].dat>a[p].dat)zig(p); }else{ add(a[p].r,val),updata(p); if(a[a[p].r].dat>a[p].dat)zag(p); } updata(p); } void remove(int &p,int val){ if(p==0)return; if(a[p].val==val){ if(a[p].cnt>1){ a[p].cnt--,updata(p); return; } if(a[p].l||a[p].r){ if(a[p].r==0||a[a[p].l].dat>a[a[p].r].dat){ zig(p),remove(a[p].r,val); }else{ zag(p),remove(a[p].l,val); } updata(p); }else p=0; return; } remove(a[p].val>val?a[p].l:a[p].r,val); updata(p); } int getPre(int val){ int ans=1,p=root; while(p){ if(a[p].val==val){ if(a[p].l){ p=a[p].l; while(a[p].r)p=a[p].r; ans=p; } } if(a[p].val<val&&a[p].val>a[ans].val)ans=p; p=a[p].val>val?a[p].l:a[p].r; } return a[ans].val; } int getNext(int val){ int ans=2,p=root; while(p){ if(a[p].val==val){ if(a[p].r){ p=a[p].r; while(a[p].l)p=a[p].l; ans=p; } break; } if(a[p].val>val&&a[p].val<a[ans].val)ans=p; p=a[p].val>val?a[p].l:a[p].r; } return a[ans].val; } int main(){ build(); cin>>n; while(n--){ int opt,x; scanf("%d%d",&opt,&x); switch(opt){ case 1: add(root,x); break; case 2: remove(root,x); break; case 3: printf("%d\n",getRankByVal(root,x)-1); break; case 4: printf("%d\n",getValByRank(root,x+1)); break; case 5: printf("%d\n",getPre(x)); break; case 6: printf("%d\n",getNext(x)); break; } } }
标签:cnt,return,val,int,updata,Treap,T105331,模板,size 来源: https://www.cnblogs.com/zbsy-wwx/p/11742361.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。