zoukankan      html  css  js  c++  java
  • 【模板】二逼平衡树(树套树)

    板子不解释

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstdlib>
     5 #include<cstring>
     6 using namespace std;
     7 const int N=50010, inf=2147483647;
     8 int n, m, a[N], b[N<<1], cnt;
     9 int rt[N], idx, ch[N<<8][2], sz[N<<8], xx[N], yy[N], totx, toty;
    10 #define ls(o) ch[o][1]
    11 #define rs(o) ch[o][2]
    12 
    13 void ins(int &o, int x, int v, int l=1, int r=cnt){
    14     if(!o) o=++idx; sz[o]+=v; if(l == r) return ; int mid=l+r>>1; 
    15     if(x <= mid) ins(ls(o), x, v, l, mid); else ins(rs(o), x, v, mid+1, r);
    16 } 
    17 void modify(int x, int v){
    18     int k=lower_bound(b+1, b+cnt+1, a[x])-b;
    19     for(int i=x; i <= n; i+=i&(-i)) ins(rt[i], k, v);
    20 }
    21 
    22 void getsum(int &sum){for(int i=1; i <= totx; i++) sum-=sz[ls(xx[i])]; for(int i=1; i <= toty; i++) sum+=sz[ls(yy[i])];}
    23 void getls(){for(int i=1; i <= totx; i++) xx[i]=ls(xx[i]); for(int i=1; i <= toty; i++) yy[i]=ls(yy[i]);}
    24 void getrs(){for(int i=1; i <= totx; i++) xx[i]=rs(xx[i]); for(int i=1; i <= toty; i++) yy[i]=rs(yy[i]);}
    25 void prepare(int L, int R){for(int i=L-1; i; i-=i&-i) xx[++totx]=rt[i]; for(int i=R; i; i-=i&-i) yy[++toty]=rt[i];}
    26 int find_kth(int k, int l=1, int r=cnt){
    27     if(l == r) return l; int mid=l+r>>1, ss=0; getsum(ss);
    28     if(ss >= k) {getls(); return find_kth(k, l, mid);}
    29     getrs(); return find_kth(k-ss, mid+1, r);
    30 }
    31 void Find_kth(int L, int R, int K){totx=toty=0; prepare(L, R); printf("%d
    ", b[find_kth(K)]);}
    32 
    33 int get_rank(int o, int x, int l=1, int r=cnt){
    34     if(!o) return 0; if(l == r) { return 0; return sz[o];} int mid=l+r>>1;
    35     if(x <= mid) return get_rank(ls(o), x, l, mid); return sz[ls(o)]+get_rank(rs(o), x, mid+1, r);
    36 }
    37 void Get_rank(int L, int R, int c){
    38     int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b;
    39     for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x);
    40     for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x);
    41     printf("%d
    ", ss+1);
    42 }
    43 
    44 void Get_pre(int L, int R, int c){
    45     int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b;
    46     for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x);
    47     for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x);
    48     if(!ss) printf("%d
    ", -inf);
    49     else Find_kth(L, R, ss);
    50 }
    51 void Get_post(int L, int R, int c){
    52     int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b+1;
    53     for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x);
    54     for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x);
    55     if(ss > R-L) printf("%d
    ", inf);
    56     else Find_kth(L, R, ss+1);
    57 }
    58 
    59 int read(){
    60     int out=0, f=1; char c=getchar(); 
    61     while(c < '0' || c > '9') {if(c == '-') f=-1; c=getchar();}
    62     while(c >= '0' && c <= '9') {out=(out<<1)+(out<<3)+c-'0'; c=getchar();}
    63     return out*f;
    64 }
    65 
    66 int cmd[N], ql[N], qr[N], qk[N];
    67 void solve()
    68 {
    69     n=read(); m=read();  
    70     for(int i=1; i <= n; i++) a[i]=read(), b[++cnt]=a[i];
    71     for(int i=1; i <= m; i++) {
    72         cmd[i]=read(), ql[i]=read(), qr[i]=read(); 
    73         if(cmd[i] != 3) qk[i]=read(); 
    74         if(cmd[i] == 3) b[++cnt]=qr[i];
    75         else if(cmd[i] != 2) b[++cnt]=qk[i]; 
    76     }
    77     sort(b+1, b+cnt+1); cnt=unique(b+1, b+cnt+1)-b-1;
    78     for(int i=1; i <= n; i++) modify(i, 1);
    79     for(int i=1; i <= m; i++){
    80         if(cmd[i] == 1) Get_rank(ql[i], qr[i], qk[i]);
    81         if(cmd[i] == 2) Find_kth(ql[i], qr[i], qk[i]);
    82         if(cmd[i] == 3) modify(ql[i], -1), a[ql[i]]=qr[i], modify(ql[i], 1);
    83         if(cmd[i] == 4) Get_pre(ql[i], qr[i], qk[i]);
    84         if(cmd[i] == 5) Get_post(ql[i], qr[i], qk[i]);
    85     }
    86 }
    87 
    88 int main()
    89 {
    90     solve();
    91     return 0;
    92 }
  • 相关阅读:
    redis php 实例
    redis 常用操作命令
    Django2.2集成xadmin管理后台所遇到的错误集锦,解决填坑
    软件测试理论知识点
    网络七层协议模型、TCP/IP四层模型
    UDP和TCP有什么区别
    HTTP与HTTPS的区别
    mysql的主键和索引
    mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法
    chmod命令详细用法
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/10316549.html
Copyright © 2011-2022 走看看