BZOJ3224/LOJ104 普通平衡树 treap(树堆)
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:
1. 插入x
2. 删除x(若有多个相同的数,因只删除一个)
3. 查询x的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
题解:
二叉搜索树可以完成目标,但是单次操作的时间复杂度可能退化为线性
因此使用平衡二叉树,$treap$(树堆)
树堆是各类平衡树中,速度和代码复杂度比较均衡的一个
速度比splay快且好写,比sbt,替罪羊慢但简单,个人觉得代码比较简单
BZOJ
LOJ
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
int casn,n,m,k;
#define nd treap[now]
#define ndl treap[treap[now].l]
#define ndr treap[treap[now].r]
#define ndt treap[tmp]
struct node {
int l,r,val,num,size,rnd;
}treap[maxn];
int cnt,root,ans;
inline void resize(int now){
nd.size=ndl.size+ndr.size+nd.num;
}
inline void rturn(int &now){
int tmp=nd.l;
nd.l=ndt.r,ndt.r=now;
ndt.size=nd.size;
resize(now);
now=tmp;
}
inline void lturn(int &now){
int tmp=nd.r;
nd.r=ndt.l,ndt.l=now;
ndt.size=nd.size;
resize(now);
now=tmp;
}
void insert(int &now,int val){
if(!now) {
now=++cnt;
nd=(node){0,0,val,1,1,rand()};
return ;
}
nd.size++;
if(val==nd.val)nd.num++;
else if(val>nd.val){
insert(nd.r,val);
if(ndr.rnd<nd.rnd) lturn(now);
}else{
insert(nd.l,val);
if(ndl.rnd<nd.rnd) rturn(now);
}
}
void erase(int &now,int val){
if(!now) return ;
if(val==nd.val){
if(nd.num>1){
nd.num--,nd.size--;
return ;
}
if(nd.r*nd.l==0) now=nd.l+nd.r;
else {
if(ndl.rnd<ndr.rnd) rturn(now);
else lturn(now);
erase(now,val);
}
}else {
nd.size--;
if(val>nd.val) erase(nd.r,val);
else erase(nd.l,val);
}
}
int query_rank(int now,int val){
if(!now) return 0;
if(val==nd.val)return ndl.size+1;
if(val>nd.val) return ndl.size+nd.num+query_rank(nd.r,val);
return query_rank(nd.l,val);
}
int query_val(int now,int rank){
if(!now) return 0;
if(rank<=ndl.size) return query_val(nd.l,rank);
if(rank-ndl.size<=nd.num) return nd.val;
return query_val(nd.r,rank-ndl.size-nd.num);
}
int query_pre(int now,int val){
if(!now) return ans;
if(val<=nd.val) return query_pre(nd.l,val);
ans=nd.val;
return query_pre(nd.r,val);
}
int query_sub(int now,int val){
if(!now) return ans;
if(val>=nd.val) return query_sub(nd.r,val);
ans=nd.val;
return query_sub(nd.l,val);
}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
int root=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a==1) insert(root,b);
if(a==2) erase(root,b);
if(a==3) printf("%d\n",query_rank(root,b));
if(a==4) printf("%d\n",query_val(root,b));
if(a==5) printf("%d\n",query_pre(root,b));
if(a==6) printf("%d\n",query_sub(root,b));
}
#ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
BZOJ3224/LOJ104 普通平衡树 treap(树堆)的更多相关文章
- 可旋转Treap(树堆)总结
树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...
- treap(树堆)
一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数. 假设所有的 ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ3224/LOJ104 普通平衡树 pb_ds库自带红黑树
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)
题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...
- 查找——图文翔解Treap(树堆)
之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...
- 树堆(Treap)学习笔记 2020.8.12
如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- 真·浅谈treap树
treap树是一种平衡树,它有平衡树的性质,满足堆的性质,是二叉搜索树,但是我们需要维护他 为什么满足堆的性质?因为每个节点还有一个随机权值,按照随机权值维持这个堆(树),可以用O(logn)的复杂度 ...
随机推荐
- Hudson持续集成管理平台搭建
IP: 10.0.70.106 8G 内存 (Hudson 多 个 工程 在 同 时 构建 的情况下 比 较耗内存) 环 境: CentOS 6.5 . JDK7 注:Hudson 只是一个持续集成 ...
- Web项目发布的更新
在项目发版后经常需要修改bug,解决出现的各种问题,对项目升级,这时候就需要将之前部署,上线的项目更新版本. 本文就简单说一下一些出现的关键点(不到之处欢迎指教) 1.使用idea,eclipse等工 ...
- extern "C" 含义
extern "C" 被 extern 限定的函数或变量是 extern 类型的 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的 e ...
- 自学python 6.
内容:id() is == 编码 解码1.好声音选秀比赛评委在打分的时候可以进行输入. 假设有10个评委.让10个评委进行打分, 要求, 分数必须大于5分, 小于10分.count = 1while ...
- PS 使用笔记 - PS 让工作台适应 当前图层
1. PS 让工作台适应 当前图层 选中图层 打开 [图像]=>[裁切] 勾选以下,确定即可
- Newtonsoft.Json 的高级用法
Ø 简介 接着前一篇http://www.cnblogs.com/abeam/p/8295765.html,继续研究 Newtonsoft.Json 的一些高级用法.主要包括: 1. JSON ...
- IEEE LaTeX模板使用BibTeX
IEEE LaTeX 模板使用 BibTeX 在Google Scholar获得的文献引用格式一般是BibTex的,而IEEE Transactions的模板默认用的是BibItem.目前没有什么自动 ...
- tensorflow faster rcnn 代码分析一 demo.py
os.environ["CUDA_VISIBLE_DEVICES"]=2 # 设置使用的GPU tfconfig=tf.ConfigProto(allow_soft_placeme ...
- pyaudio
安装: 下载whl文件:https://github.com/intxcc/pyaudio_portaudio/releases 切换到whl文件目录,直接用pip安装 pip instal ...
- [C++]油田(Oil Deposits)-用DFS求连通块
[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...