模板—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* ...
随机推荐
- SEO 搜索引擎优化培训01
百度搜索风云榜:http://top.baidu.com/boards 页面上的因素:对搜索引擎而言
- ffmpeg resize and scale
ffmpeg缩小视频尺寸 | 楚盟博客 https://www.5yun.org/13126.html ffmpeg -i test.mp4 -s 480×360 out.mp4 常用分辨率: 108 ...
- Delphi中SendMessage使用说明(所有消息说明) good
Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...
- Called attach on a child which is not detached
问题:Called attach on a child which is not detached: ViewHolder#出现问题的原因 经过google后发现,出现该问题的原因是由于recycle ...
- c# 关于一些数值转换的整理(部分)
1.c#整型转字符型,不足2位的在前面补0. //1->01 1.ToString().PadLeft(2,'0'); 2.Convert.ToString(str1)和str1.ToStrin ...
- 红米note手机连接mac系统
到http://www.android.com/filetransfer/ 下androidfiletransfer.dmg文件,安装好这个软件,然后再连接usb就可以用这个软件管理手机内存卡和s ...
- Python Tricks(十九)—— switch 的实现
python 原生语法不支持 switch,体现了 Python 大道至简的设计思路,有时为了避免啰嗦的 if elif等判断语句,我们可以用字典来代替 switch 的各分支,也即建立表达式和操作的 ...
- UVA 10559 Blocks —— 区间DP
题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...
- [置顶][终极精简版][图解]Nginx搭建flv mp4流媒体服务器
花了我接近3周,历经了重重问题,今日终于把流媒体服务器搞定,赶紧的写个博文以免忘记... 起初是跟着网上的一些教程来的,但是说的很不全面,一些东西也过时不用了(比如jwplayer老版本).我这次是用 ...
- IDEA中Spark读Hbase中的数据
import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.io.ImmutableBytesWr ...