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 ...
随机推荐
- Baker Vai LightOJ - 1071 (MCMF)
在个给出的矩阵从,从左上角走到右下角,然后再从右下角走到左上角,两次不能经过想同的点,每个点都有一个价值,问最大的价值是多少. 可以把原来的问题化简成从左上角走两条路到右下角,然后把价值加起来,然是这 ...
- C++类相关
本文打算通过一些小例子来说明几个关键的知识点. 一:成员函数相关 #include <iostream> using namespace std; class D { public: vo ...
- Libre OJ 144、145 (DFS序)
部分参考自博客:https://blog.csdn.net/hpu2022/article/details/81910490 在许多问题中,由于树结构复杂通常会导致问题很棘手,因为其实非线性结构,操作 ...
- 牛客小白月赛6C-桃花(DFS/BFS求树的直径)
链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- 详解vue的数据binding原理
自从angular火了以后,各种mv*框架喷涌而出,angular虽然比较火,但是他的坑还是蛮多的,还有许多性能问题被人们吐槽.比如坑爹的脏检查机制,数据binding是受人喜爱的,脏检查就有点…性能 ...
- 浅析 @PathVariable 和 @RequestParam(转发,非原创)
首先 上两个地址:地址①http://localhost:8989/SSSP/emps?pageNo=2地址②http://localhost:8989/SSSP/emp/7如果想获取地址①中的 pa ...
- Docker系列教程05 容器常用命令
https://mp.weixin.qq.com/s?__biz=MzI4ODQ3NjE2OA==&mid=2247483890&idx=1&sn=2721f08624e6de ...
- 10元买啤酒问题Java解法
10元去买啤酒,2元一瓶.每两个瓶可以换一瓶啤酒,每四个瓶盖可以换一瓶啤酒.最多买几瓶? public class Java { public static void main(String[] ar ...
- semantic ui框架学习笔记一
面包屑导航 面包屑导航经常用于多个栏目下的内容管理,是web页面里比较常用的组合.例如: <div class="ui breadcrumb"> <a class ...
- mybatis的0和null
<if test="type!=null and type!=''">这样判断会把0也当做null的 另外写一个条件判断0 <if test="type ...