普通平衡树(treap)
题干:6种操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
一道treap板子题(splay也行)
下面是又长又持久的treap:
1.update
维护当前子树大小。
void update(int x)
{
tr[x].size=tr[tr[x].ls].size+tr[tr[x].rs].size+tr[x].w;
}
2.旋转(lturn,rturn)
lturn(x):把x转到原来的左儿子处。
rturn(x):把x转到原来的有儿子处。
void lturn(int &x)
{
int t = tr[x].rs;
tr[x].rs=tr[t].ls;
tr[t].ls=x;
tr[t].size=tr[x].size;
update(x);
x=t;
}
void rturn(int &x)
{
int t=tr[x].ls;
tr[x].ls=tr[t].rs;
tr[t].rs=x;
tr[t].size=tr[x].size;
update(x);
x=t;
}
3.插入
插入一个点。具体步骤:
1.在最下面找到他。
2.加一个随机权值,扔进去。(随机权值目的:防止树退化成一条链,若退化则会将后面操作的时间复杂度从O(logn)变成O(n)。)
void insert(int &k , int x)
{
if(k == )
{
cnt ++ ;
k = cnt ;
tr[k].size = tr[k].w = ;
tr[k].n1 = x ;
tr[k].n2 = rand() ;
return ;
}
tr[k].size ++ ;
if(tr[k].n1 == x) tr[k].w ++ ;
else if(x > tr[k].n1)
{
insert(tr[k].rs , x) ;
if(tr[tr[k].rs].n2 < tr[k].n2) lturn(k) ;
}else
{
insert(tr[k].ls , x) ;
if(tr[tr[k].ls].n2 < tr[k].n2) rturn(k) ;
}
}
如果不会随机数的话。。。https://www.cnblogs.com/LiGuanlin1124/p/9592229.html
4.删除
比插入复杂一点:
1.找到他。
2.分情况讨论:
{
(1).只有一个儿子,则直接将其附成儿子。
(2).儿女双全。选两个儿子中随机数rand值小的转上去,一直转到其满足(1)。(即将他儿子转没。)
(3),没有儿子。残忍地return。
}
代码:
void del(int &k,int x)
{
if(!k)return ;
if(tr[k].n1==x)
{
if(tr[k].w>)
{
tr[k].size--;
tr[k].w--;
return ;
}
if(tr[k].ls*tr[k].rs==)
{
k=tr[k].ls+tr[k].rs;
}else if(tr[tr[k].ls].n2<tr[tr[k].rs].n2)
{
rturn(k);
del(k,x);
}else
{
lturn(k);
del(k,x);
}
}else if(tr[k].n1<x)
{
tr[k].size--;
del(tr[k].rs,x);
}else
{
tr[k].size--;
del(tr[k].ls,x);
}
}
5.查询排名,查询某排名是谁
难度小了很多,递归就行。
int pm(int k,int x)
{
if(!k)return ;
if(tr[k].n1==x)
{
return tr[tr[k].ls].size+;
}
if(tr[k].n1<x)
{
return tr[tr[k].ls].size+tr[k].w+pm(tr[k].rs,x);
}else
{
return pm(tr[k].ls,x);
}
}
int qp(int k,int x)//k子树内排名x的数
{
if(!k)return ;
if(x>tr[tr[k].ls].size&&x<=tr[tr[k].ls].size+tr[k].w)
{
return tr[k].n1;
}else if(x<=tr[tr[k].ls].size)
{
return qp(tr[k].ls,x);
}else
{
return qp(tr[k].rs,x-tr[tr[k].ls].size-tr[k].w);
}
}
6.前驱后继
这是平衡树最普遍的用途了吧。
int ans;
void qq(int k,int x)
{
if(!k)return ;
if(tr[k].n1<x)
{
ans=k;
qq(tr[k].rs,x);
}else
{
qq(tr[k].ls,x);
}
}
void hj(int k,int x)
{
if(!k)return ;
if(tr[k].n1>x)
{
ans=k;
hj(tr[k].ls,x);
}else
{
hj(tr[k].rs,x);
}
}
普通平衡树(treap)的更多相关文章
- hiho #1325 : 平衡树·Treap
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...
- hiho一下103周 平衡树·Treap
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- 【山东省选2008】郁闷的小J 平衡树Treap
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- 普通平衡树Treap(含旋转)学习笔记
浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
- HihoCoder1325 : 平衡树·Treap(附STL版本)
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 2021.12.06 平衡树——Treap
2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...
随机推荐
- HDU6050: Funny Function(推公式+矩阵快速幂)
传送门 题意 利用给出的式子求\(F_{m,1}\) 分析 直接推公式(都是找规律大佬) \(n为偶数,F_{m,1}=\frac{2(2^n-1)^{m-1}}3\) \(n为奇数,F_{m,1}= ...
- PTA 朋友圈【并查集的合并问题】
一开始,考虑的是每次就是把第一个作为祖先,这样很明显是错误的,比如 7 4 3 1 2 3 2 4 2 3 5 6 7 1 6 所以这正是更好地体现对于集合的代表.只有把所有的元素合并一下,然后选一个 ...
- USACO Training3.1联系【排序终极题目】By cellur925
题目传送门 这题我们很容易想到直接枚举即可.算法本身并没有什么难度但是细节超多!于是这题整整卡了一天....... (不,还是我太弱了.) 期间还暴露出一些平时没有特别注意的问题,这次一起解决. 开始 ...
- shell getopts
1, 分类: LINUX getopts命令内置于shell中,可以获取由单个字符所指定的有效命令行参数,单个字符有一个‘ - ’号或‘ + ’号. 简单的说,比如运行命令: iptables -t ...
- MVC模式到传统风格的Spring MVC
现在我们要做个简单的基于servlet的MVC的模型,我们要有一个Product要从表单处获取. MVC中的M是模型,V是视图,C是控制器.视图负责应用的展示,模型封装了数据和业务逻辑,控制器负责接收 ...
- Log4net系列二:Log4net邮件日志以及授权码
Log4net邮件发送 上篇文章我们主要介绍Log4net生成文本格式,本篇文章主要配置邮箱发送.关于项目的引用,搭建我们就不在描述,如果不太清楚,请看上篇文章, 老规矩,我们现在配置文件中添加一个a ...
- 【转】深入理解Android中的SharedPreferences
SharedPreferences作为Android中数据存储方式的一种,我们经常会用到,它适合用来保存那些少量的数据,特别是键值对数据,比如配置信息,登录信息等.不过要想做到正确使用SharedPr ...
- Android虚拟机电池状态设置
问题描述: 安装SDK后使用AVD配合APPIUM进行测试,此时虚拟机的电池状态为0%充电中:部分APP会对手机电池状态有要求,不符合要求时,无法安装或打开. 解决思路: 1.Android系统设置( ...
- linux下查看nginx配置文件地址
which nginx/usr/sbin/nginx -t
- CFBundleURLTypes URL scheme
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Ar ...