zoukankan      html  css  js  c++  java
  • treap codevs 4543普通平衡树

    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    struct shu
    {
     int l,r,sum1,zhi,dui,sum2;
    }a[100006];
    int n,root,size,ans;
    void you(int &a1)
    {
     int t=a[a1].l;
     a[a1].l=a[t].r;
     a[t].r=a1;
     a[t].sum1=a[a1].sum1;
     a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
     a1=t;
     return;
    }
    void zuo(int &a1)
    {
     int t=a[a1].r;
     a[a1].r=a[t].l;
     a[t].l=a1;
     a[t].sum1=a[a1].sum1;
     a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
     a1=t;
     return;
    }
    void cha(int &a1,int a2)
    {
     if(a1==0)
       {
        size++;
        a1=size;
        a[a1].sum1=1;
        a[a1].sum2=1;
        a[a1].zhi=a2;
        a[a1].dui=rand();
        return;
       }
     a[a1].sum1++;
     if(a[a1].zhi==a2)
       {
       a[a1].sum2++;
          return;
       }
     if(a2<a[a1].zhi)
       {
        cha(a[a1].l,a2);
        if(a[a[a1].l].dui<a[a1].dui)
          you(a1);
       }
     else
       {
        cha(a[a1].r,a2);
        if(a[a[a1].r].dui<a[a1].dui)
          zuo(a1);
       }
    }
    void shan(int &a1,int a2)
    {
     if(a1==0)
       return;
     if(a[a1].zhi==a2)
     {
      if(a[a1].sum2>1)
       {
        a[a1].sum2--;
        a[a1].sum1--;
          }
      else if(a[a1].l*a[a1].r==0)
             a1=a[a1].l+a[a1].r;
           else if(a[a[a1].l].dui<a[a[a1].r].dui)
                  {
                    you(a1);
                    shan(a1,a2);
                  }
                else
                  {
                    zuo(a1);
                    shan(a1,a2);
         }
      return;
     }
     a[a1].sum1--;
     if(a[a1].zhi<a2)
       shan(a[a1].r,a2);
     else
       shan(a[a1].l,a2);
     return;
    }
    int cha1(int a1,int a2)
    {
     if(a1==0)
       return 0;
     if(a[a1].zhi==a2)
       return a[a[a1].l].sum1+1;
     if(a[a1].zhi>a2)
       return cha1(a[a1].l,a2);
       return a[a[a1].l].sum1+a[a1].sum2+cha1(a[a1].r,a2); 
    }
    int cha2(int a1,int a2)
    {
     if(a1==0)
       return 0;
     if(a[a[a1].l].sum1>=a2)
       return cha2(a[a1].l,a2);
     if(a[a[a1].l].sum1+a[a1].sum2>=a2)
       return a[a1].zhi;
     return cha2(a[a1].r,a2-a[a[a1].l].sum1-a[a1].sum2);
    }
    void qian(int a1,int a2)
    {
     if(a1==0)
       return;
     if(a[a1].zhi<a2)
       {
        ans=a[a1].zhi;
        qian(a[a1].r,a2);
       }
     else
       qian(a[a1].l,a2);
     return;
    }
    void hou(int a1,int a2)
    {
     if(a1==0)
       return;
     if(a[a1].zhi>a2)
       {
        ans=a[a1].zhi;
        hou(a[a1].l,a2);
       }
     else
       hou(a[a1].r,a2);
     return;
    }
    int main()
    {
     srand(time(0));
     scanf("%d",&n);
     for(int i=0;i<n;i++)
       {
        int a1,a2;
        scanf("%d%d",&a1,&a2);
        if(a1==1)
          cha(root,a2);
        if(a1==2)
          shan(root,a2);
        if(a1==3)
          printf("%d ",cha1(root,a2));
        if(a1==4)
          printf("%d ",cha2(root,a2));
        if(a1==5)
          {
           ans=0;
           qian(root,a2);
            printf("%d ",ans);
          }
        if(a1==6)
          {
           ans=0;
           hou(root,a2);
           printf("%d ",ans);
       }
       }
       return 0;
    }

  • 相关阅读:
    工作了四五年,感觉技术上依旧长进不大
    Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级
    Fundebug支持浏览器报警
    JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
    Vue UI:Vue开发者必不可少的工具
    阿里巴巴TXD前端小报
    深入了解浏览器存储:对比Cookie、LocalStorage、sessionStorage与IndexedDB
    JavaScript字符串转数字的5种方法及其陷阱
    灵活使用 console 让 js 调试更简单
    JavaScript大师必须掌握的12个知识点
  • 原文地址:https://www.cnblogs.com/xydddd/p/5130846.html
Copyright © 2011-2022 走看看