zoukankan      html  css  js  c++  java
  • splay

     随便敲敲练手。。。

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long LL;
      4 const int inf=1e9;
      5 const int maxn=200000;
      6 int N,M,T,tot,root;
      7 int key[maxn],lc[maxn],rc[maxn],fa[maxn],siz[maxn];
      8 inline void update(int x){
      9     siz[x]=siz[lc[x]]+siz[rc[x]]+1;
     10 }
     11 inline void r_rotate(int x){
     12     int y=fa[x];
     13     lc[y]=rc[x];
     14     if(rc[x]) fa[rc[x]]=y;
     15     fa[x]=fa[y];
     16     if(y==lc[fa[y]]) lc[fa[y]]=x;
     17     else rc[fa[y]]=x;
     18     fa[y]=x; rc[x]=y;
     19     update(y); update(x);
     20 }
     21 inline void l_rotate(int x){
     22     int y=fa[x];
     23     rc[y]=lc[x];
     24     if(lc[x]) fa[lc[x]]=y;
     25     fa[x]=fa[y];
     26     if(y==lc[fa[y]]) lc[fa[y]]=x;
     27     else rc[fa[y]]=x;
     28     fa[y]=x; lc[x]=y;
     29     update(y); update(x);
     30 }
     31 inline void splay(int x,int s){
     32     int p;
     33     while(fa[x]!=s){
     34         int p=fa[x];
     35         if(fa[p]==s){
     36             if(x==lc[p]) r_rotate(x);
     37             else l_rotate(x);
     38             break;
     39         }
     40         else if(x==lc[p]){
     41             if(p==lc[fa[p]]) r_rotate(x),r_rotate(x);
     42             else r_rotate(x),l_rotate(x);
     43         }
     44         else if(x==rc[p]){
     45             if(p==rc[fa[p]]) l_rotate(x),l_rotate(x);
     46             else l_rotate(x),r_rotate(x);
     47         }
     48     }
     49     if(s==0) root=x;
     50 }
     51 
     52 inline void insert(int v){
     53     if(root==0){
     54         root=++tot;
     55         rc[0]=tot; key[root]=v; siz[root]=1;
     56         return ;
     57     }
     58     int tmp,x=root;
     59     while(x!=0){
     60         tmp=x;
     61         if(v<=key[x]) siz[x]++,x=lc[x];
     62         else siz[x]++,x=rc[x];
     63     }
     64     if(v<=key[tmp]){
     65         lc[tmp]=++tot;
     66         fa[tot]=tmp; key[tot]=v; siz[tot]=1;
     67     }
     68     else{
     69         rc[tmp]=++tot;
     70         fa[tot]=tmp; key[tot]=v; siz[tot]=1;
     71     }
     72     splay(tot,0);
     73 }
     74 
     75 inline int find(int v){
     76     int x=root;
     77     while(x!=0){
     78         if(v<key[x]) x=lc[x];
     79         else if(v>key[x]) x=rc[x];
     80         else{
     81             splay(x,0);
     82             return x;
     83         }
     84     }
     85     return -1;
     86 }
     87 
     88 inline int getmax(int x){
     89     int tmp;
     90     while(x!=0){
     91         tmp=x; x=rc[x];
     92     }
     93     return tmp;
     94 }
     95 inline int getmin(int x){
     96     int tmp;
     97     while(x!=0){
     98         tmp=x; x=lc[x];
     99     }
    100     return tmp;
    101 }
    102 
    103 inline void Delete(int v){
    104     int x=find(v);
    105     if(x==-1) return ;
    106     int pp=getmax(lc[x]),nn=getmin(rc[x]);
    107     if(lc[x]==0||rc[x]==0){
    108         if(lc[x]==0&&rc[x]==0){
    109             root=0; rc[0]=0;
    110             return ;
    111         }
    112         else if(lc[x]==0){
    113             rc[0]=rc[x]; fa[rc[x]]=0; root=rc[x]; rc[x]=0;
    114             siz[x]=1;
    115             return ;
    116         }
    117         else{
    118             rc[0]=lc[x]; fa[lc[x]]=0; root=lc[x]; lc[x]=0;
    119             siz[x]=1;
    120             return ;
    121         }
    122     }
    123     splay(pp,0); splay(nn,root);
    124     fa[lc[nn]]=0; siz[lc[nn]]=1; lc[nn]=0;
    125     update(nn); update(pp);
    126 }
    127 
    128 inline int rank(int x,int v){
    129     if(x==0) return 1;
    130     if(v<=key[x]) return rank(lc[x],v);
    131     else return siz[lc[x]]+1+rank(rc[x],v);
    132 }
    133 inline int findkth(int x,int k){
    134     if(siz[lc[x]]+1==k) return key[x];
    135     if(siz[lc[x]]+1>k) return findkth(lc[x],k);
    136     return findkth(rc[x],k-siz[lc[x]]-1); 
    137 }
    138 inline int pred(int rt,int v){
    139     if(rt==0)  return v;
    140     if(v<=key[rt]) return pred(lc[rt],v);
    141     else{
    142         int ans=pred(rc[rt],v);
    143         if(ans==v) return key[rt]; 
    144         return ans;
    145     }
    146 }
    147 inline int succ(int rt,int v){
    148     if(rt==0) return v;
    149     if(v>=key[rt]) return succ(rc[rt],v);
    150     else{
    151         int ans=succ(lc[rt],v);  
    152         if(ans==v) return key[rt];
    153         return ans;
    154     }
    155 }
    156 
    157 int main(){
    158     freopen("3224.in","r",stdin);
    159     freopen("3224.out","w",stdout);
    160     scanf("%d",&T);
    161     while (T--){
    162         int kin,num;
    163         scanf("%d%d",&kin,&num);
    164         if(kin==1) insert(num);
    165         else if(kin==2) Delete(num);
    166         else if(kin==3) printf("%d
    ",rank(root,num));
    167         else if(kin==4) printf("%d
    ",findkth(root,num));
    168         else if(kin==5) printf("%d
    ",pred(root,num)); 
    169         else if(kin==6) printf("%d
    ",succ(root,num));
    170     }
    171     return 0;
    172 }
  • 相关阅读:
    31 把数组排成最小的数 + 仿函数的写法就记忆这个就行了
    30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
    29 连续子数组的最大和
    c/c++ struct的大小以及sizeof用法
    28 最小的K个数
    27 数组中出现次数超过一半的数字
    26 字符串的排列
    Python 实例2—购物车
    python_threading模块实现多线程详解(转)
    Ubuntu 16.04 安装Postman
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/5364253.html
Copyright © 2011-2022 走看看