zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2020-04-07 python一行代码 http服务器文件共享
    2020-04-06 linux命令之awk
    2020-04-05 ubuntu安装docker并使用国内加速
    2020-04-04 ssh免密登录
    尚学堂 JAVA DAY11 概念总结
    尚学堂 JAVA Day3 概念总结
    尚学堂 JAVA Day1 概念总结
    Android Studio 首次安装报错 Java.lang.RuntimeException:java.lang.NullPointerException...错
    Android 迷之Version管理
    Android Develop 之 Ddevelop WorkFlow Basics
  • 原文地址:https://www.cnblogs.com/Ngshily/p/5018982.html
Copyright © 2011-2022 走看看