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\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;
}

时间: 2024-10-26 07:36:12

treap codevs 4543普通平衡树的相关文章

c++之路进阶——treap树(普通平衡树)

4543 普通平衡树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省选AKAKAK 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小于x,且最大的数)6. 求x的后继(后继定义为大

4543 普通平衡树[未完结]

4543 普通平衡树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 这是一道模板题. 如果觉得这个题水的可以做一下4544压行,是千古神犇花爸爸出的神犇题. 您需要写一种数据结构(可参考题目标题,但是这句话其实并没有什么用233),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x

平衡树讲解(旋转treap,非旋转treap,splay)

在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用的:treap和splay(其中treap包括旋转treap和非旋转treap). 一.treap treap这个词是由tree和heap组合而成,意思是树上的的堆(其实就是字面意思啦qwq).treap可以说是由二叉搜索树(BST)进化而来,二叉搜索树每个点满足它左子树中所有点权值都比它小,它右子

【bzoj2770】YY的Treap 权值线段树

题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分配一个priority,同时保证这棵平衡树关于priority是一个小根堆以保证效率).这时候不怎么友爱的510跑了出来,他问了YY小朋友一个极不和谐的问题:怎么求Treap中两个点之间的路径长度.YY秒了之后决定把这个问题交给你来做,但只要求出树中两点的LCA. 输入 第一行两个整数n,m 第二行

数据结构录 之 BST的高级应用。

BST就是二叉检索树,或者是二叉排序树,或者叫二叉搜索树等等. BST的平衡问题可以去学习AVL树或者Treap或者Splay这些平衡树. BST的一些高级应用: 1,求BST中比k小的数的个数: 只需在BST上面多维护值size,表示当前这个节点的子树的点的个数. 伪代码如下: 1 BST tree; 2 3 int getCou(int k) { 4 Node * u=tree.root; 5 int ret=0; 6 7 while(u!=NULL) { 8 if(u->val<k) {

python总结六

1.python中主要存在四种命名方式: object #公用方法 _object #半保护 #被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量, 在模块或类外不可以使用,不能用’from module import *’导入. #__object 是为了避免与子类的方法名称冲突, 对于该标识符描述的方法,父 类的方法不能轻易地被子类的方法覆盖,他们的名字实际上是 _classname__methodname. _ _ object  #全私有,全保护 #私有成员“pr

待更新算法

网络流 最大流和最小费用最大流原理 上下界网络流 模拟费用流 网络流建模总结 带花树 树 树上倍增 树链剖分 点分治 基环树 DP 概率期望dp 单调队列dp 状压dp 斜率优化dp 计算几何 模板 半平面交 好题 数据结构 线段树高级应用 可持久化线段树 Treap Splay 可持久化平衡树 树套树 分块 莫队 数学 多项式 生成函数 斯特林数 FWT min_25 筛 二次剩余 线性递推 线性基 线性代数 线性规划 群论 字符串 KMP,Z-algorithm,Manacher SA SA

数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline __attri\ bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now) { now = 0; register char word = getchar (); bool temp = false; while (wor

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉