利用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. thinkphp5 如何使用查询事件?

    它是对数据库的CURD操作事件进行了钩子,当事件触发时,会进行回调. 就像是注册事件和前置方法或后置方法类似 下面是demo <?php namespace app\index\controll ...

  2. ELK日志系统安装、配置

    1.关闭SELINUX: [root@ELK /]# vim /etc/selinux/config 将SELINUX=enforcing修改为SELINUX=disabled 2.关闭防火墙: [r ...

  3. LCOW —— 单一Docker引擎下可同时运行Linux和Windows容器啦!

    https://blog.csdn.net/m2l0zgssvc7r69efdtj/article/details/79251059 就在上周,Docker官方的master分支上新增了LCOW(Li ...

  4. bzoj1218 激光炸弹

    bz上难得一见的水题啊. 我们发现:这个SB居然只要枚举就行了!!! 我TM...... /****************************************************** ...

  5. 洛谷P2762 太空飞行计划问题

    这题套路好深......没想渠. 题意:给你若干个设备,若干个任务. 每个任务需要若干设备,设备可重复利用. 完成任务有钱,买设备要钱. 问最大总收益(可以什么任务都不做). 解:最大权闭合子图. 对 ...

  6. Flask Mysql数据库连接

    下载库: pip install flask-sqlalchemy 下载后进入终端使用python后import导入模块测试没有报错就说明成功了 py文件: # -*- encoding: utf-8 ...

  7. 物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例

    https://blog.csdn.net/u012812482/article/details/51079890 1. 效果 2. 简介 1. 其中仪表的部分使用的是ECharts的gauge控件实 ...

  8. 向redis中添加删除list列表

    转: 向redis中添加删除list列表 2018年04月18日 15:44:54 luo_yu_1106 阅读数:4082   一.添加 向redis中添加队列有两种方式 1.lpush l是lef ...

  9. 一个很适合初学者的selenium教程

    http://www.cnblogs.com/hustar0102/p/5885115.html

  10. spring mvc后端校验validator

    springmvc中我们使用hibernate的校验框架validation: pom: <validator.version>5.2.4.Final</validator.vers ...