treap基本操作
利用rand保持堆的特性
const int N=; int ls[N],rs[N],v[N],p[N],cnt[N],siz[N];
// 权值 优先级
inline void update(int &k){
siz[k]=siz[ls[k]]+siz[rs[k]];}
inline void zig(int &k){//treap旋转上实际上是在根节点,不记录fa
int y=ls[k];// < 入
ls[k]=rs[y];
rs[y]=k; siz[y]=siz[k];
update(k);
k=y;//令k返回根节点
}
inline void zag(int &k){
int y=rs[k];
rs[y]=ls[y];
ls[y]=k; siz[y]=siz[k];
update(k);
k=y;
} inline void insert(int &k,int &val){
if(!k){
k=++idx;v[k]=val;p[k]=rand();
cnt[k]=siz[k]=;return;}
else ++siz[k]; if(val<v[k]){
insert(ls[k],val);
if(p[ls[k]]<p[k]) zig(k);}
else if(v[k]==val) ++cnt[k];
else{insert(rs[k],val);
if(p[rs[k]]<p[k]) zag(k);}
} inline void del(int &k,int &val){
//找到链节点或者数值>1即可直接不用再递归
if(val==v[k]){
if(<cnt[k]) --cnt[k],--siz[k];
//数值>1
else if(!ls[k]||!rs[k]) k=ls[k]+rs[k];
//链结点
//两个非空节点
else if(p[ls[k]]<p[rs[k]]) zig(k),del(k,val);
else zag(k),del(k,val);
return;
}
--siz[k];
if(val<v[k]) del(ls[k],val);
else del(rs[k],val);
}
//前驱后继
inline int pre(int &val){
int k=rt,ans=-inf;
while(k){
if(v[k]<=val) ans=v[k],k=rs[k];
else k=ls[k];}
return ans;}
inline int beh(int &val){
int k=rt,ans=-inf;
while(k){
if(val<=v[k]) ans=v[k],k=ls[k];
else k=rs[k];}
return ans;}
//
inline int queryKth(int x){
int k=rt;
while(k){
if(siz[ls[k]]<x&&x<=siz[ls[k]]+cnt[k]) return v[k];
if(x<=siz[ls[k]]) k=ls[k];
else k-=siz[ls[k]]+cnt[k],k=rs[k];}
return ;
}
inline int queryrank(int &val){
int k=rt,res=;
while(k){
if(v[k]==val) return res+siz[ls[k]]+;
else if(val<v[k]) k=ls[k];
else res+=siz[ls[k]]+cnt[k],k=rs[k];}
return res;
}
treap基本操作的更多相关文章
- 数据结构之Treap
1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...
- BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】
BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...
- Treap基本用法总结
Treap=Tree+Heap 起名的人非常有才 Treap是啥? 一棵二叉搜索树可能退化成链,那样各种操作的效率都比较低 于是可爱的Treap在每个节点原先值v的基础上加了一个随机数rnd,树的形 ...
- c++之路进阶——codevs4543(普通平衡树)
4543 普通平衡树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...
- Treap入门(转自NOCOW)
Treap 来自NOCOW Treap,就是有另一个随机数满足堆的性质的二叉搜索树,其结构相当于以随机顺序插入的二叉搜索树.其基本操作的期望复杂度为O(log n). 其特点是实现简单,效率高于伸展树 ...
- Treap树的基础知识
原文 其它较好的的介绍:堆排序 AVL树 树堆,在数据结构中也称Treap(事实上在国内OI界常称为Traep,与之同理的还有"Tarjan神犇发明的"Spaly),是指有一个随 ...
- 三大平衡树(Treap + Splay + SBT)总结+模板[转]
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...
- 初识Treap
Treap,简单的来说就是Tree+Heap,是一颗平衡树,每个节点有两个信息:1.key:当前节点的关键字 :2.fix:当前节点优先级.key满足二叉排序数的性质,即左儿子都比当前节点小,右儿子都 ...
- 查找——图文翔解Treap(树堆)
之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...
随机推荐
- NOIP2011Mayan游戏(模拟)
Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...
- Python学习day3 数据类型Ⅰ(str,int,bool)
day3 数据类型 @上节内容补充 每周一个思维导图-xmind.exe in / not in #示例:(是否包含敏感字符)while True: text = input('请输入你要说的 ...
- nodejs的某些api~(三)net模块
net模块和http模块是node最重要的两个模块,前者是基于TCP的封装,后者的本质也是TCP.他们通过 tcp通信,建立一个可以收发消息的web服务器.我在写的作品里面用的express也是封装的 ...
- Linux添加新硬盘及分区,格式化,挂载
1.查看分区信息: [root@localhost /]# fdisk -l Disk /dev/vdb: 209.7 GB, 209715200000 bytes16 heads, 63 secto ...
- HTML5新特性:FileReader 和 FormData
连接在这里: HTML5新特性:FileReader 和 FormData
- 【洛谷P4878】布局
题目大意:给定一个长度为 N 的递增序列,有 M 组差分约束关系,求满足这些约束关系时,第一个数和第 N 个数的差是多少. 题解:首先,能否满足约束关系需要判断一下负环,若满足约束关系,再从第一个点 ...
- 【洛谷P1896】互不侵犯
题目大意:给定 N*N 的棋盘,一共放 K 个国王,一共有多少种方法. 题解: i&i<<1 判断是否每个 1 的位置之间都有 0. i&j<<1 判断 i 中 ...
- Could not install the app on the device, read the error above for details. Make sure you have an Android emulator running or a device connected and have set up your Android development environment:
Administrator@DESKTOP-EHCTIOR MINGW64 /d/react-native-eyepetizer (master) $ react-native run-android ...
- 第一节,初识OpenCV3-图像的读、写、显、格式转化等
之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...
- python logging日志模块
一.logging模块的简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不 ...