#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普通平衡树
时间: 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)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉