模板—treap
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define INF 0x7fffffff
using namespace std ;
struct treap
{
int l,r,val,dat,cnt,size;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define val(x) tr[x].val
#define dat(x) tr[x].dat
#define cnt(x) tr[x].cnt
#define size(x) tr[x].size
}tr[];
int tot,root,n; int New(int val)
{
++tot;
val(tot)=val;
dat(tot)=rand();
size(tot)=cnt(tot)=;
return tot;
}
void updata(int x)
{
size(x)=cnt(x)+size(l(x))+size(r(x));
}
void build()
{
New(-INF),New(INF);
root=;
r()=;
updata(root);
}
void zig(int &p)//you
{
int q=l(p);
l(p)=r(q);
r(q)=p;
updata(p),updata(q);
p=q;
}
void zag(int &p)//zuo
{
int q=r(p);
r(p)=l(q);
l(q)=p;
updata(p),updata(q);
p=q;
}
int grbv(int p,int val)
{
if(!p)return ;
if(val==val(p))return size(l(p))+;
if(val(p)>val) return grbv(l(p),val);
return grbv(r(p),val)+size(l(p))+cnt(p);
}
int gvbr(int p,int rank)
{
if(!p)return INF;
if(size(l(p))>=rank)return gvbr(l(p),rank);
if(size(l(p))+cnt(p)>=rank)return val(p);
return gvbr(r(p),rank-size(l(p))-cnt(p));
}
void insert(int &p,int val)
{
if(!p){p=New(val);return;}
if(val(p)==val){cnt(p)++;updata(p);return;}
if(val(p)>val)
{
insert(l(p),val);
if(dat(l(p))>dat(p))zig(p);
}
else
{
insert(r(p),val);
if(dat(r(p))>dat(p))zag(p);
}
updata(p);
}
void remove(int &p,int val)
{
if(!p)return;
if(val(p)==val)
{
if(cnt(p)>){cnt(p)--;updata(p);return;}
if(l(p) || r(p))
{
if(r(p)== || dat(l(p))>dat(r(p)))
zig(p),remove(r(p),val);
else
zag(p),remove(l(p),val);
updata(p);
}
else p=;
return;
}
val<val(p)?remove(l(p),val):remove(r(p),val);
updata(p);
}
int getpre(int val)
{
int ans=,p=root;
while(p)
{
if(val(p)==val)
{
if(l(p)>)
{
p=l(p);
while(r(p)>)p=r(p);
ans=p;
}
break;
}
if(val(p)<val && val(p)>val(ans))ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
int getnext(int val)
{
int ans=,p=root;
while(p)
{
if(val(p)==val)
{
if(r(p)>)
{
p=r(p);
while(l(p)>)p=l(p);
ans=p;
}
break;
}
if(val(p)>val && val(p)<val(ans))ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
signed main()
{
// freopen("input2.in","r",stdin); build();
cin>>n;
int opt,x;
for(int i=;i<=n;i++)
{
cin>>opt>>x;
if(opt==)insert(root,x);
if(opt==)remove(root,x);
if(opt==)cout<<grbv(root,x)-<<endl;
if(opt==)cout<<gvbr(root,x+)<<endl;
if(opt==)cout<<getpre(x)<<endl;
if(opt==)cout<<getnext(x)<<endl;
}
}
模板—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实现名次树
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* ...
随机推荐
- Appro DM8127 IPNC 挂载NFS遇到的问题及解决
对于Appro DM8127 IPNC,默认的启动方式是NAND is used for booting kernel and NAND is used as root filesystem 为了调试 ...
- Java String常见问题
一.怎样推断两个String是否相等??使用"=="还是使用"equals()"? 对String来说."=="是用来推断两个字符串(对象) ...
- SQL Server 运行计划操作符具体解释(1)——断言(Assert)
前言: 非常多非常多地方对于语句的优化,一般比較靠谱的回复即使--把运行计划发出来看看.当然那些仅仅看语句就说怎样怎样改代码,我一直都是拒绝的,由于这样的算是纯蒙.依据本人经验,大量的性能问题单纯从语 ...
- Java 基础 —— 注解
注解(annotation)不是注释(comment): 注解,是一种元数据(metadata),可为我们在代码中添加信息提供了一种形式化的方法.注解在一定程度上实现了元数据和源代码文件的结合,而不是 ...
- bzoj 1924 所驼门王的宝藏
题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
- BZOJ_2424_[HAOI2010]订货_最小费用最大流
BZOJ_2424_[HAOI2010]订货_最小费用最大流 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付 ...
- 编译Ruby2.0 问题解决
compiling readline.creadline.c: In function ‘Init_readline’:readline.c:1886:26: error: ‘Function’ un ...
- 个人微信号二次开发SDK协议,个人微信号二次开发api接口
通过这个API接口可以做什么? 通过我们提供的API接口您可以开发: 工作手机(如:X创,X码,XX管家等) 微信群讲课软件(如:讲课X师,一起X堂等) 微信社群管理软件(如:小X管家,微X助手等) ...
- SpringBoot2.x版本整合SpringSecurity、Oauth2进行password认证
很多人在进行项目开发时都会用到Oauth2.0结合SpringSecurity或者Shiro进行权限拦截以及用户验证,网上也有很多的案例,前几天项目里边需要用到,顺便整合了进来,特此写篇博客,记录下过 ...
- 【第三届强网杯】write up
一,鲲or鳗orGame 从浏览器里拿到game.gb 用 VisualBoyAdvance ,搜索内存变量,然后改变量就完事了,但是改变量他们说直接利用添加代码功能有bug,所以要在工具里的内存查看 ...