treap初步

  • 模板题

    bzoj3224普通平衡树

    功能齐全的模板题

 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
",query_rank(root,x));
81         else if(opt==4)printf("%d
",query_num(root,x));
82         else if(opt==5){
83             pro(root,x);
84             printf("%d
",tr[ans].v);
85         }
86         else{
87             sub(root,x);
88             printf("%d
",tr[ans].v);
89         }
90     }
91     return 0;
92 }
View Code

    bzoj1588营业额统计

    找前驱和后继取较小值,然而数据有问题

 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
",ans);
63     return 0;
64 }
View Code
  • 坑B题&老爷题

    bzoj1503郁闷的出纳员

    本来想用treap瞎转删除区间,然而被老爷说乱搞,因为treap的旋转是用来维护堆性质的  

 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
");
71             else printf("%d
",query(root,tr[root].size-x+1)+add);
72         }
73     }
74     printf("%d
",ans);
75     return 0;
76 }
View Code
原文地址:https://www.cnblogs.com/Ngshily/p/5018982.html