模板—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* ...
随机推荐
- Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP
C. Logo Turtle A lot of people associate Logo programming language with turtle graphics. In this c ...
- gcc的搜索路径,头文件和库
1 抛开默认的搜索路径,自己指定搜索路径 第一,明确自己编写的代码所需要的头文件和库放在了哪里 第二,使用“-I”指定头文件的搜索路径,使用-rpath指定库的搜索路径 2 无论是本地编译还是交叉编译 ...
- 【CEOI2002】【Poj 1038】Bugs Integrated, Inc.
http://poj.org/problem?id=1038 发一下中文题面(今天考试直接被改了): 生记茶餐厅由于受杀人事件的影响,生意日渐冷清,不得不暂时歇业.四喜赋闲在家,整天抱着零食看电视,在 ...
- 杂项:MySQL
ylbtech-杂项:MySQL 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://www.mysql.com/ 1. https://bai ...
- C 的数据类型和基本类型转换方式
C中的类型分为 整数数据类型 浮点类型 void类型 基本类型符号: 默认数值为十进制,例如:10,20 以0开头的数值为八进制,例如:010,020 以0b开头的数值为二进制,例如:0b0011 以 ...
- bzoj 1598: [Usaco2008 Mar]牛跑步【A*K短路】
A*K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis ...
- noip2016 小结(ac两题+学习总结)
NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...
- Django day 36 支付宝支付,微信推送
一:支付宝支付, 二:微信推送
- 分布式事务(三)mysql对XA协议的支持
系列目录 分布式事务(一)原理概览 分布式事务(二)JTA规范 分布式事务(三)mysql对XA协议的支持 分布式事务(四)简单样例 分布式事务(五)源码详解 分布式事务(六)总结提高 引子 从Mys ...
- mysql的子查询的提高
统计胜负结果的sql语句 date result 2011-02-01 胜 2011-02-01 负 2011-02-0 ...