#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. poj3449Geometric Shapes

    链接 繁琐. 处理出来所有的线段,再判断相交. 对于正方形的已知对角顶点求剩余两顶点 (列出4个方程求解) p[].x=(p[].x+p[].x+p[].y-p[].y)/; p[].y=(p[].y ...

  2. poj1981Circle and Points(单位圆覆盖最多的点)

    链接 O(n^3)的做法: 枚举任意两点为弦的圆,然后再枚举其它点是否在圆内. 用到了两个函数 atan2反正切函数,据说可以很好的避免一些特殊情况 #include <iostream> ...

  3. JavaWeb学习总结(七)—HttpServletRequest

    一.Request概述 request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest.在客户端发出每个请求时,服务 ...

  4. 题目:在泛型为Integer的容器内添加一个字符串.

    这个题目有两种解法,第一种利用反射来解决: //ArrayList<Integer> list = new ArrayList<Integer>(); //在这个泛型为Inte ...

  5. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  6. SenchaTouch介绍和Sencha Architect介绍以及安装

    一.SenchaTouch介绍 Sencha Touch框架是世界上第一个基于HTML 5的Mobile App框架. 在Sencha Touch这个名词中,包括了两个组成部分,其中Sencha的前身 ...

  7. shell脚本基础知识

    虽然现在能在Linux系统下生存,但是自觉效率太低,和高手有很大的差距. 这就是关于Linux的知识太过匮乏,有很多事情知道该怎么做,但是就是没法在Linux下实现,为了提升工作效率,必须要接触Lin ...

  8. 线性表 - 从零开始实现by C++

    参考链接:数据结构探险之线性表篇     线性表

  9. xcode6 devices,profiles 以及 iOS8 设备 查看profiles

    xcode6 devices,profiles 以及 iOS8 设备 查看profiles 1. xocde6 devices 不在 window----Organizer 下面了: 改为 Windo ...

  10. canvas实现绘画

    html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...