treap初步
- 模板题
bzoj3224普通平衡树
功能齐全的模板题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define maxn 100005 3 struct node{ 4 int l,r,v,rnd,w,size; 5 }tr[maxn]; 6 int root,size,ans; 7 void update(int k){ 8 tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size; 9 } 10 void lturn(int &k){ 11 int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; 12 tr[t].size=tr[k].size;update(k);k=t; 13 } 14 void rturn(int &k){ 15 int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; 16 tr[t].size=tr[k].size;update(k);k=t; 17 } 18 void insert(int &k,int x){ 19 if(!k){ 20 k=++size; 21 tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand(); 22 return; 23 } 24 tr[k].size++; 25 if(x==tr[k].v)tr[k].w++; 26 else if(x>tr[k].v){ 27 insert(tr[k].r,x); 28 if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k); 29 } 30 else{ 31 insert(tr[k].l,x); 32 if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k); 33 } 34 } 35 void del(int &k,int x){ 36 if(!k)return; 37 if(x==tr[k].v){ 38 if(tr[k].w>1){ 39 tr[k].w--;tr[k].size--; 40 return; 41 } 42 if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r; 43 else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd) 44 rturn(k),del(k,x); 45 else lturn(k),del(k,x); 46 } 47 else if(x>tr[k].v)tr[k].size--,del(tr[k].r,x); 48 else tr[k].size--,del(tr[k].l,x); 49 } 50 int query_rank(int k,int x){ 51 if(!k)return 0; 52 if(x==tr[k].v)return tr[tr[k].l].size+1; 53 else if(x>tr[k].v) 54 return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x); 55 else return query_rank(tr[k].l,x); 56 } 57 int query_num(int k,int x){ 58 if(!k)return 0; 59 if(x<=tr[tr[k].l].size)return query_num(tr[k].l,x); 60 else if(x>tr[tr[k].l].size+tr[k].w)return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); 61 else return tr[k].v; 62 } 63 void pro(int k,int x){ 64 if(!k)return; 65 if(x>tr[k].v)ans=k,pro(tr[k].r,x); 66 else pro(tr[k].l,x); 67 } 68 void sub(int k,int x){ 69 if(!k)return; 70 if(x<tr[k].v)ans=k,sub(tr[k].l,x); 71 else sub(tr[k].r,x); 72 } 73 int main(){ 74 int n,opt,x; 75 scanf("%d",&n); 76 for(int i=1;i<=n;i++){ 77 scanf("%d%d",&opt,&x); 78 if(opt==1)insert(root,x); 79 else if(opt==2)del(root,x); 80 else if(opt==3)printf("%d\n",query_rank(root,x)); 81 else if(opt==4)printf("%d\n",query_num(root,x)); 82 else if(opt==5){ 83 pro(root,x); 84 printf("%d\n",tr[ans].v); 85 } 86 else{ 87 sub(root,x); 88 printf("%d\n",tr[ans].v); 89 } 90 } 91 return 0; 92 }
bzoj1588营业额统计
找前驱和后继取较小值,然而数据有问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define inf 0x3f3f3f3f 5 #define maxn 1000005 6 struct node{ 7 int l,r,v,rnd,w,size; 8 }tr[maxn]; 9 int yo,yoo,size,root; 10 void update(int k){ 11 tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size; 12 } 13 void lturn(int &k){ 14 int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; 15 tr[t].size=tr[k].size;update(k);k=t; 16 } 17 void rturn(int &k){ 18 int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; 19 tr[t].size=tr[k].size;update(k);k=t; 20 } 21 void insert(int &k,int x){ 22 if(!k){ 23 k=++size; 24 tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand(); 25 return; 26 } 27 tr[k].size++; 28 if(x==tr[k].v)tr[k].w++; 29 else if(x>tr[k].v){ 30 insert(tr[k].r,x); 31 if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k); 32 } 33 else{ 34 insert(tr[k].l,x); 35 if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k); 36 } 37 } 38 void pro(int k,int x){ 39 if(!k)return; 40 if(x>=tr[k].v)yo=tr[k].v,pro(tr[k].r,x); 41 else pro(tr[k].l,x); 42 } 43 void sub(int k,int x){ 44 if(!k)return; 45 if(x<=tr[k].v)yoo=tr[k].v,sub(tr[k].l,x); 46 else sub(tr[k].r,x); 47 } 48 int main(){ 49 int n,ans,x; 50 scanf("%d%d",&n,&ans); 51 insert(root,ans); 52 if(ans<0)ans=-ans; 53 for(int i=2;i<=n;i++){ 54 yo=-inf,yoo=inf; 55 //scanf("%d",&x); 56 if(scanf("%d",&x)==EOF)x=0; 57 pro(root,x); 58 sub(root,x); 59 ans+=min(x-yo,yoo-x); 60 insert(root,x); 61 } 62 printf("%d\n",ans); 63 return 0; 64 }
- 坑B题&老爷题
bzoj1503郁闷的出纳员
本来想用treap瞎转删除区间,然而被老爷说乱搞,因为treap的旋转是用来维护堆性质的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 100005 4 struct node{ 5 int l,r,v,rnd,w,size; 6 }tr[maxn]; 7 int size,root; 8 void update(int k){ 9 tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size; 10 } 11 void lturn(int &k){ 12 int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; 13 tr[t].size=tr[k].size;update(k);k=t; 14 } 15 void rturn(int &k){ 16 int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; 17 tr[t].size=tr[k].size;update(k);k=t; 18 } 19 void insert(int &k,int x){ 20 if(!k){ 21 k=++size; 22 tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand(); 23 return; 24 } 25 tr[k].size++; 26 if(x==tr[k].v)tr[k].w++; 27 else if(x>tr[k].v){ 28 insert(tr[k].r,x); 29 if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k); 30 } 31 else{ 32 insert(tr[k].l,x); 33 if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k); 34 } 35 } 36 int del(int &k,int x){ 37 int haha; 38 if(!k)return 0; 39 if(tr[k].v<x){ 40 haha=tr[tr[k].l].size+tr[k].w; 41 k=tr[k].r; 42 return haha+del(k,x); 43 } 44 else{ 45 haha=del(tr[k].l,x); 46 tr[k].size-=haha; 47 return haha; 48 } 49 } 50 int query(int k,int x){ 51 if(x<=tr[tr[k].l].size)return query(tr[k].l,x); 52 else if(x>tr[tr[k].l].size+tr[k].w)return query(tr[k].r,x-tr[tr[k].l].size-tr[k].w); 53 else return tr[k].v; 54 } 55 int main(){ 56 int n,lim,x,add=0,ans=0; 57 char op[5]; 58 scanf("%d%d",&n,&lim); 59 for(int i=1;i<=n;i++){ 60 scanf("%s%d",op,&x); 61 if(op[0]=='I'){ 62 if(x>=lim)insert(root,x-add); 63 } 64 else if(op[0]=='A')add+=x; 65 else if(op[0]=='S'){ 66 add-=x; 67 ans+=del(root,lim-add); 68 } 69 else{ 70 if(x>tr[root].size)printf("-1\n"); 71 else printf("%d\n",query(root,tr[root].size-x+1)+add); 72 } 73 } 74 printf("%d\n",ans); 75 return 0; 76 }