【模板】Treap
Treap,又称树堆,是一种通过堆性质来维持BST平衡的数据结构。具体体现在对于树上每一个点来说,既有BST维护的值,又有一个堆维护的随机生成的值。维护平衡性的办法是根据堆维护的值的相对大小关系进行左旋和右旋这两种操作,在旋转的前后,依然满足BST性质。
latest updated:2019.2.25
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
struct node{
#define ls(p) t[p].lc
#define rs(p) t[p].rc
int lc,rc,val,rd,cnt,size;
}t[maxn];
int tot,root;
inline int newnode(int val){
++tot,t[tot].val=val,t[tot].rd=rand(),t[tot].size=t[tot].cnt=1;
return tot;
}
inline void pushup(int p){
t[p].size=t[ls(p)].size+t[rs(p)].size+t[p].cnt;
}
inline void zig(int &p){
int lson=ls(p);
ls(p)=rs(lson),rs(lson)=p,p=lson;
pushup(rs(p)),pushup(p);
}
inline void zag(int &p){
int rson=rs(p);
rs(p)=ls(rson),ls(rson)=p,p=rson;
pushup(ls(p)),pushup(p);
}
void insert(int &p,int val){
if(!p)p=newnode(val);
else if(val==t[p].val)++t[p].size,++t[p].cnt;
else if(val<t[p].val){
++t[p].size,insert(ls(p),val);
if(t[ls(p)].rd>t[p].rd)zig(p);
}else{
++t[p].size,insert(rs(p),val);
if(t[rs(p)].rd>t[p].rd)zag(p);
}
}
void remove(int &p,int val){
if(!p)return;
else if(val<t[p].val)--t[p].size,remove(ls(p),val);
else if(val>t[p].val)--t[p].size,remove(rs(p),val);
else{
if(t[p].cnt>1)--t[p].cnt,--t[p].size;
else if(!ls(p)||!rs(p))p=ls(p)+rs(p);
else if(t[ls(p)].rd>t[rs(p)].rd)zig(p),remove(p,val);
else zag(p),remove(p,val);
}
}
int kth(int p,int k){
if(k<=t[ls(p)].size)return kth(ls(p),k);
else if(k>t[ls(p)].size+t[p].cnt)return kth(rs(p),k-t[ls(p)].size-t[p].cnt);
else return t[p].val;
}
int getrank(int p,int val){
if(t[p].val==val)return t[ls(p)].size+1;
else if(val<t[p].val)return getrank(ls(p),val);
else return getrank(rs(p),val)+t[p].cnt+t[ls(p)].size;
}
int getpre(int p,int val){
if(!p)return -inf;
else if(t[p].val>=val)return getpre(ls(p),val);
else return max(getpre(rs(p),val),t[p].val);
}
int getnxt(int p,int val){
if(!p)return inf;
else if(t[p].val<=val)return getnxt(rs(p),val);
else return min(getnxt(ls(p),val),t[p].val);
}
int main(){
int n;scanf("%d",&n);
while(n--){
int opt,val;
scanf("%d%d",&opt,&val);
switch(opt){
case 1:insert(root,val);break;
case 2:remove(root,val);break;
case 3:printf("%d\n",getrank(root,val));break;
case 4:printf("%d\n",kth(root,val));break;
case 5:printf("%d\n",getpre(root,val));break;
case 6:printf("%d\n",getnxt(root,val));break;
}
}
return 0;
}
【模板】Treap的更多相关文章
- 模板——Treap
不得不说平衡树博大精深,除了Treap,还有splay,非旋Treap和可持久化数据结构,今天先讲讲Treap,也很感谢这位大佬的博客给予我帮助:http://www.360doc.com/conte ...
- [模板] Treap
插入x 删除x 查询排名为x的数 查询x的排名 求x的前驱.后继 //Stay foolish,stay hungry,stay young,stay simple #include<iostr ...
- 模板—treap
#include<iostream> #include<cstdio> #include<cstdlib> #define INF 0x7fffffff using ...
- 模板——Treap实现名次树
Treap 是一种通过赋予结点随机权值的一种满足堆性质的二叉搜索树,它很好的解决了二叉搜索树顺序插入组成链式的局限性. 名次树是指在treap的每个结点中添加附加域size,表示以它为根的子树的总结点 ...
- LG3369 普通平衡树
题意 维护一些数,其中需要提供以下操作: 1.插入\(x\) 2.删除\(x\)(若有多个相同的数,只删除一个) 3.查询\(x\)的排名(排名定义为比当前数小的数的个数\(+1\)) 4.查询排名为 ...
- treap树模板
///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- 三大平衡树(Treap + Splay + SBT)总结+模板[转]
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...
- treap完全版模板
这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int ...
- Treap 模板 poj1442&hdu4557
原理可以看hihocoder上面的讲解,很清楚,不多说了. 模板抄lrj训练指南上面的. /** Treap 实现 名次树 功能: 1.找到排名为k的元素 2.值为x的元素的名次 初始化:Node* ...
随机推荐
- 【下一代核心技术DevOps】:(六)Rancher集中存储及相关应用
1. 前言 为什么要使用集中存储? 使用集中存储有个很大的优势是数据安全和统一管理,和集群完美配合. 产品集成存储经历过几个阶段: 1.单机本机存储. 系统使用本地硬盘存储 2.单网络集中存储. 局域 ...
- 多校寒训TaoTao要吃鸡dp
题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包 之后可以多携带h(h为0代表没有装备背包)重量 ...
- Peer Programming Project: 4 Elevators Scheduler 学号后三位 157,165
1.Advantages and disanvantages of Peer Programming advantages The code are constantly validated by t ...
- 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度
20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...
- springboot整合fastJson遇到重定向问题
通过网上教程使用springboot整合fastJson后遇到页面重定向问题(使用的springboot版本是2.0.2.RELEASE ,其他的版本可能不会出现以下问题),如下图: 我的项目结构如下 ...
- junit4实验报告
一:题目简介 测试一个加.减.乘.除. 二:源码的github链接 https://github.com/wangyuefang/test/blob/master/daiceshilei.md htt ...
- 软件工程(GZSD2015) 第二次作业进度
贵州师范大学软件工程第二次作业 徐 镇 王铭霞 张 英 涂江枫 张 燕 安 坤 周 娟 杨明颢 杨家堂 罗文豪 娄秀盛 周 娟 李盼 岳庆 张颖 李丽思 邓婷 唐洁 郑倩 尚清丽 陈小丽 毛茸 宋光能 ...
- java的OutOfMemoryError: PermGen space实战剖析
由Word导出为PDF,导致java.lang.OutOfMemoryError: PermGen space 永生代空间不足,导致内存溢出,用jvisualvm监控了一下,永生代默认值80~90M, ...
- Java正则解析HTML一例
import java.util.regex.Matcher;import java.util.regex.Pattern; public class Test { static String tes ...
- Windows平台下面Oracle11.2.0.1 升级Oracle11.2.0.4 的简单步骤
1. 首先查看数据库的版本: 2. ESXi 上面的虚拟机挂在 oracle11.2.0.4的 iso磁盘 3. 执行set 进行升级 4. 安装选项进行选择 升级现有的数据库 5. 注意安装位置必须 ...