码迷,mamicode.com
首页 > 其他好文 > 详细

treap codevs 4543普通平衡树

时间:2016-01-14 17:27:41      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

#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\n",cha1(root,a2));
    if(a1==4)
      printf("%d\n",cha2(root,a2));
    if(a1==5)
      {
       ans=0;
       qian(root,a2);
        printf("%d\n",ans);
      }
    if(a1==6)
      {
       ans=0;
       hou(root,a2);
       printf("%d\n",ans);
   }
   }
   return 0;
}

treap codevs 4543普通平衡树

标签:

原文地址:http://www.cnblogs.com/xydddd/p/5130846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!