zoukankan      html  css  js  c++  java
  • bzoj 3224 splay模板题4

    再刷水题我就废了。。。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<algorithm>
      4 #include<cstring>
      5 #define lc(x) ch[x][0]
      6 #define rc(x) ch[x][1]
      7 #define inf 0x3f3f3f3f
      8 #define N 200005
      9 using namespace std;
     10 int ch[N][2];
     11 int k[N];int cnt,root;
     12 int size[N],fa[N];
     13 void push_up(int x)
     14 {
     15     size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
     16 }
     17 void rotate(int p)
     18 {
     19     int q=fa[p],y=fa[q],x=(p==ch[q][1]);
     20     ch[q][x]=ch[p][x^1];fa[ch[q][x]]=q;
     21     ch[p][x^1]=q;fa[q]=p;
     22     fa[p]=y;
     23     if(y)
     24     {
     25         if(q==ch[y][1])ch[y][1]=p;
     26         else ch[y][0]=p;
     27     }
     28     push_up(q);push_up(p);
     29     return ;
     30 }
     31 void splay(int x)
     32 {
     33     for(int y;y=fa[x];rotate(x))
     34     {
     35         if(fa[y])
     36         {
     37             if((ch[y][0]==x&&ch[fa[y]][0]==y)||(ch[y][1]==x&&ch[fa[y]][1]==y))rotate(y);
     38             else rotate(x);
     39         }
     40     }
     41     root=x;
     42 }
     43 int pre(int v)
     44 {
     45     int x=root;int tmp=-inf;
     46     while(ch[x][k[x]<v])
     47     {
     48         if(k[x]<v)tmp=k[x];
     49         x=ch[x][k[x]<v];
     50     }if(k[x]<v)tmp=k[x];
     51     return tmp;
     52 }
     53 int suc(int v)
     54 {
     55     int x=root;int tmp=inf;
     56     while(ch[x][k[x]<=v])
     57     {
     58         if(k[x]>v)tmp=k[x];
     59         x=ch[x][k[x]<=v];
     60     }if(k[x]>v)tmp=k[x];
     61     return tmp;
     62 }
     63 int find(int z)
     64 {
     65     int x=root;
     66     if(k[x]==z)return x;
     67     while(ch[x][k[x]<z])
     68     {
     69         x=ch[x][k[x]<z];
     70         if(k[x]==z)return x;
     71     }
     72     return 0;
     73 }
     74 void insert(int z)
     75 {
     76     int x=root;size[x]++;
     77     while(ch[x][k[x]<z])x=ch[x][k[x]<z],size[x]++;
     78     cnt++;ch[x][k[x]<z]=cnt;k[cnt]=z;size[cnt]=1;fa[cnt]=x;splay(cnt);
     79 }
     80 void del(int x)
     81 {
     82     splay(x);
     83     if(!ch[x][1])
     84     {
     85         root=ch[x][0];fa[ch[x][0]]=0;
     86     }
     87     else if(!ch[x][0])
     88     {
     89         root=ch[x][1];fa[ch[x][1]]=0;
     90     }
     91     else 
     92     {
     93         fa[ch[x][0]]=0;int tmp=ch[x][0];
     94         while(ch[tmp][1])tmp=ch[tmp][1];
     95         splay(tmp);ch[tmp][1]=ch[x][1];fa[ch[x][1]]=tmp;
     96         push_up(tmp);
     97     }
     98     return ;
     99 }
    100 int fd(int kk,int x)
    101 {
    102     int l=ch[kk][0];int r=ch[kk][1];
    103     if(size[l]+1==x)return k[kk];
    104     if(size[l]>=x)return fd(l,x);
    105     return fd(r,x-size[l]-1);
    106 }
    107 int pr(int z)
    108 {
    109     int ans=0;
    110     int x=root;
    111     while(x)
    112     {
    113         if(k[x]<=z)
    114         {
    115             ans+=size[ch[x][0]]+1;
    116             x=ch[x][1];
    117         }
    118         else x=ch[x][0];
    119     }
    120     return ans;
    121 }
    122 void yu()
    123 {
    124     root=1;k[1]=inf;cnt=1;size[1]=1;
    125     insert(-inf);
    126 }
    127 int main()
    128 {
    129    yu();
    130    int n;
    131    scanf("%d",&n);
    132    for(int o=1;o<=n;o++)
    133    {
    134          int t1,t2;
    135          scanf("%d%d",&t1,&t2);
    136          if(t1==1)
    137          {
    138              insert(t2);
    139       }
    140       else if(t1==2)
    141       {
    142           int x1=find(t2);
    143           if(x1!=0)del(x1);
    144       }
    145       else if(t1==3)
    146       {
    147           printf("%d
    ",pr(t2-1));
    148       }
    149       else if(t1==4)
    150       {
    151            printf("%d
    ",fd(root,t2+1));
    152       }
    153       else if(t1==5)
    154       {
    155            printf("%d
    ",pre(t2));
    156       }
    157       else 
    158       {
    159           printf("%d
    ",suc(t2));
    160       }
    161    }
    162    return 0;
    163 }
  • 相关阅读:
    JavaScript AMD 模块加载器原理与实现
    nodejs之日志管理
    实时监测每秒上行下行流量,一款 iOS Today Widget 监测器Demo,还可以可以监测内存大小、存储空间等信息
    Swift 2.0基本语法
    【京东助手】滑稽东试用助手 V1.6.0
    我也秀秀windows phone版博客园客户端
    asp.net做的网站账号登陆后注销不管用了
    分享个自己做的CSDN刷下载积分软件
    推荐一个很好用的HTTP操作类
    新软件马上就要完成了,先发篇文章YY下
  • 原文地址:https://www.cnblogs.com/ezyzy/p/6145129.html
Copyright © 2011-2022 走看看