#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普通平衡树的更多相关文章

  1. codevs 4543 treap 模板

    type rec=record lc,rc,v,rnd,size,w,fa:longint; end; var n,root,tot,ans,opt,x,i,po:longint; tr:array[ ...

  2. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  3. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  4. HDU 4585 平衡树Treap

    点击打开链接 题意:给出n组数,第一个数是id.第二个数是级别.每输入一个.输出这个人和哪个人打架,这个人会找和他级别最相近的人打,假设有两个人级别和他相差的一样多,他就会选择级别比他小的打架. 思路 ...

  5. c++之路进阶——codevs4543(普通平衡树)

    4543 普通平衡树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...

  6. 【BZOJ3224】【tyvj1728】普通平衡树

    最近开始学习平衡树,在学长的强烈推荐下学习了AVL.红黑树.splay(以上我都还没学)treap. 首先讲一下个人对treap(树堆)的理解. treap,顾名思义,就是tree+heap,首先因为 ...

  7. 旋转/非旋转treap的简单操作

    treap(树堆) 是在二叉搜索树的基础上,通过维护随机附加域,使其满足堆性质,从而使树相对平衡的二叉树: 为什么可以这样呢? 因为在维护堆的时候可以同时保证搜索树的性质: (比如当一棵树的一个域满足 ...

  8. bzoj 2770 YY的Treap

    Written with StackEdit. Description 志向远大的\(YY\)小朋友在学完快速排序之后决定学习平衡树,左思右想再加上\(SY\)的教唆,\(YY\)决定学习\(Trea ...

  9. 【BZOJ2770】YY的Treap 结论+线段树

    [BZOJ2770]YY的Treap Description 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了Y ...

随机推荐

  1. [转载] google mock CheatSheet

    原文: https://code.google.com/p/googlemock/wiki/CheatSheet Defining a Mock Class Mocking a Normal Clas ...

  2. linux学习笔记2-命令总结5

    压缩解压命令 bzip2,gunzip,gzip,tar,zip 网络命令 ifconfig - 查看和配置网卡 lastlog - 检查某特定用户上次登录的时间 last - 列出目前和过去登入系统 ...

  3. js输出26个字母两种方法(js fromCharCode的使用)

    方法一 var character = new Array("A","B","C","D","E", ...

  4. C# 上传RAR文件 解压 获取解压后的文件名称

    此方法适用于C盘windows文件夹中有WinRAR.exe文件 if (fileExt.ToUpper() == ".RAR") { string zpath = Server. ...

  5. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  6. 【Todo】Python字符编码学习

    Python中经常出现字符编码问题,在这里统一整理吧. 参考这篇文章:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 另外这个人 ...

  7. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!

    看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...

  8. C++时间函数模板

    //测时间 class Timer { private: clock_t _start; clock_t _end; public: Timer() { start(); } void start() ...

  9. CSS3_边框属性之圆角

    一.border-radius是向元素添加圆角边框: border-radius的值不仅能用px单位,你还可以用百分比或者em,但兼容性目前还不太好.(都不能是负值) 1.border-radius ...

  10. Python 学习笔记 - 10.类(Class) 1

    定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...