平衡树板子qaq
Posted gaojunonly1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡树板子qaq相关的知识,希望对你有一定的参考价值。
bzoj3224
#include <cstdio> #include <algorithm> using namespace std; #define N 100005 #define inf 0x7ffffffffffff #define int long long struct treap { int l,r,val,dat,cnt,size; }a[N]; int tot=0,root,n; inline int New(int val) { a[++tot].val=val; a[tot].dat=rand(); a[tot].cnt=a[tot].size=1; return tot; } inline void updata(int p) { a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt; } inline void build() { New(-inf); New(inf); root=1; a[1].r=2; updata(root); } inline int GetRankByVal(int p,int val) { if(p==0) return 0; if(val==a[p].val) return a[a[p].l].size+1; if(val<a[p].val) return GetRankByVal(a[p].l,val); return GetRankByVal(a[p].r,val)+a[a[p].l].size+a[p].cnt; } inline int GetValByRank(int p,int rank) { if(p==0) return inf; 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); } inline void rturn(int &p) { int q=a[p].l; a[p].l=a[q].r; a[q].r=p; p=q; updata(a[q].r); updata(p); } inline void lturn(int &p) { int q=a[p].r; a[p].r=a[q].l; a[q].l=p; p=q; updata(a[q].l); updata(p); } inline void insert(int &x,int val) { if(x==0) { x=New(val); return; } if(val==a[x].val) { a[x].cnt++; updata(x); return; } if(val<a[x].val) { insert(a[x].l,val); if(a[x].dat<a[a[x].l].dat) rturn(x); } else { insert(a[x].r,val); if(a[x].dat<a[a[x].r].dat) lturn(x); } updata(x); } inline int GetPre(int val) { int ans=1,p=root; while(p) { if(val==a[p].val) { if(a[p].l>0) { p=a[p].l; while(a[p].r>0)p=a[p].r; ans=p; } break; } if(a[p].val<val&&a[p].val>a[ans].val) ans=p; p=val<a[p].val?a[p].l:a[p].r; } return a[ans].val; } inline int GetNext(int val) { int ans=2,p=root; while(p) { if(val==a[p].val) { if(a[p].r>0) { p=a[p].r; while(a[p].l>0)p=a[p].l; ans=p; } break; } if(a[p].val>val&&a[p].val<a[ans].val) ans=p; p=val<a[p].val?a[p].l:a[p].r; } return a[ans].val; } inline void remove(int &p,int val) { if(p==0)return; if(val==a[p].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) { rturn(p); remove(a[p].r,val); } else { lturn(p); remove(a[p].l,val); } updata(p); } else p=0; return; } val<a[p].val?remove(a[p].l,val):remove(a[p].r,val); updata(p); } signed main() { int i,op,x; build(); scanf("%lld",&n); for(i=1;i<=n;i++) { scanf("%lld%lld",&op,&x); switch(op) { case 1: insert(root,x); break; case 2: remove(root,x); break; case 3: printf("%d ",GetRankByVal(root,x)-1); break; case 4: printf("%d ",GetValByRank(root,x+1)); break; case 5: printf("%d ",GetPre(x)); break; case 6: printf("%d ",GetNext(x)); break; } } }
以上是关于平衡树板子qaq的主要内容,如果未能解决你的问题,请参考以下文章
各种平衡树收集(收集控(‐^▽^‐))平衡树模板题的各种花式做法QAQ