利用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基本操作的更多相关文章

  1. 数据结构之Treap

    1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...

  2. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

    BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...

  3. Treap基本用法总结

    Treap=Tree+Heap  起名的人非常有才 Treap是啥? 一棵二叉搜索树可能退化成链,那样各种操作的效率都比较低 于是可爱的Treap在每个节点原先值v的基础上加了一个随机数rnd,树的形 ...

  4. c++之路进阶——codevs4543(普通平衡树)

    4543 普通平衡树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...

  5. Treap入门(转自NOCOW)

    Treap 来自NOCOW Treap,就是有另一个随机数满足堆的性质的二叉搜索树,其结构相当于以随机顺序插入的二叉搜索树.其基本操作的期望复杂度为O(log n). 其特点是实现简单,效率高于伸展树 ...

  6. Treap树的基础知识

    原文 其它较好的的介绍:堆排序  AVL树 树堆,在数据结构中也称Treap(事实上在国内OI界常称为Traep,与之同理的还有"Tarjan神犇发明的"Spaly),是指有一个随 ...

  7. 三大平衡树(Treap + Splay + SBT)总结+模板[转]

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

  8. 初识Treap

    Treap,简单的来说就是Tree+Heap,是一颗平衡树,每个节点有两个信息:1.key:当前节点的关键字 :2.fix:当前节点优先级.key满足二叉排序数的性质,即左儿子都比当前节点小,右儿子都 ...

  9. 查找——图文翔解Treap(树堆)

    之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...

随机推荐

  1. centos7安装部署本地局域网yum源

    应用场景: 当Linux系统都是最小化安装的系统,又无法做到每台都能访问外网的情况下,安装常用工具或者依赖包的最好办法可能就是建立本地yum源了. 安装环境: 一台 centos 7.4 minima ...

  2. 买卖股票的最佳时机II

    题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股 ...

  3. 51nod 1005 1027 1029 高精度

    Java大数用法参考:https://www.cnblogs.com/jin-nuo/p/5313205.html 1005 大数加法: import java.util.*; import java ...

  4. Nginx环境的搭建

    源码安装 不同发行版使用的安装程序都不同,所以官方提供了源代码,我们需要将原代码编译后再安装. 源程序使用C语言开发,所以需要安装C语言的编译环境. 安装Nginx环境和第三方支持库 yum inst ...

  5. [luogu4309][最长上升子序列]

    题目链接 思路 因为这些数字是从小到大加进去的,所以以当前数字结尾的最长上升子序列可以从前面位置的任何一个数字转移过来.所以只要能知道每个数字最终位于哪个位置就行了. 没想到出了treap还有什么办法 ...

  6. python中的单例模式、元类

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  7. eCharts使用图表简单示例

    https://blog.csdn.net/hlbt0112/article/details/48862427 1. eCharts官网 http://echarts.baidu.com/index. ...

  8. 动态样式语言—LESS基础知识

    CSS是一门非程序式语言,缺少逻辑性,不便于维护 LESS在CSS现有语法的基础上,为CSS加入程序式语言的特性 引入了变量.混入.运算.函数等功能,大大简化CSS的编写,降低了CSS的维护成本 LE ...

  9. Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)

    E. Explosion Exploit time limit per test 2.0 s memory limit per test 256 MB input standard input out ...

  10. 高级组件——菜单栏JMenuBar

    菜单栏JMenuBar,菜单JMenu,菜单项JMenuItem 一旦A有子菜单项,则A为菜单JMenu,而不是菜单项JMenuItem import javax.swing.*; import ja ...