【模板】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* ...
随机推荐
- 写入mssql出现乱码
1.出现乱码的场景如下: --------------------------------------------------------------------------------------- ...
- Maven 项目生成或者update jdk变为1.5的问题
在使用Maven构建项目时,生成的maven项目jdk默认使用的是jdk1.5. 在手动修改了jdk之后,update project之后jdk又会变为1.5. 或者用eclipse的Maven插件生 ...
- Note: SE Class's Individual Project
虽然第一个Project还有点小问题需要修改,但是大体已经差不多了,先把blog记在这里,算是开博第一篇吧! 1.项目预计的用时 本来看到这个题的时候想的并不多,但是看了老师的要求才觉得如此麻烦ORZ ...
- 实验五 TCP传输及加密
实验内容: 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者DE ...
- 软件工程(五)UML
UML 统一建模语言,又称标准建模语言.是用来对软件密集系统进行可视化建模的一种语言.包括UML语义和UML表示法两个元素. UMl图由事物和关系组成,事物:UML模型中最基本的构成元素,是具有代表性 ...
- 关于EA和ED的区别
在申请美国大学本科的过程中,申请的截止时间往往分为两轮:提前申请(Early Decision/Action) 和常规申请 (Regular Decision).提前申请,顾名思义,截止时间会相对早一 ...
- HDU 2052 Picture
http://acm.hdu.edu.cn/showproblem.php?pid=2052 Problem Description Give you the width and height of ...
- 携程Apollo配置中心架构深度剖析
转自:http://www.uml.org.cn/wfw/201808153.asp 一.介绍 Apollo(阿波罗)[参考附录]是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在 ...
- From 简书 转帖一下如何安装k8s1.10 改天做下实验. https://www.jianshu.com/p/9c7e1c957752
centos7.3 kubernetes/k8s 1.10 离线安装 老菜_misa 关注 2018.04.25 23:57 字数 1243 阅读 266评论 1喜欢 3 本文介绍在centos7.3 ...
- 转《trackingjs+websocket+百度人脸识别API,实现人脸签到》流程
先用websocket与后台建立通讯:用trackingjs在页面调用电脑摄像头,监听人脸,发现有人脸进入屏幕了,就把图片转成base64字符串,通过websocket发送到后端:后端拿到图片,调用百 ...