[模板]fhqTreap
用途
平衡树(可实现区间翻转)
原理
和treap一样,中序遍历表示权值的顺序,并且每个点有一个随机的附加值,形成一个堆来保证复杂度
但是不旋转,所有操作通过split和merge实现
分为两种split:按权值和按排名
代码
luogu3369 普通平衡树
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef long double ld;
const int maxn=1e5+; inline char gc(){
return getchar();
static const int maxs=<<;static char buf[maxs],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
ll x=;char c=gc();bool neg=;
while(c<''||c>''){if(c=='-') neg=;c=gc();}
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return neg?(~x+):x;
} int N,val[maxn],rdt[maxn],siz[maxn],ch[maxn][],pct,root; inline int newnode(int x){
int p=++pct;
val[p]=x;
rdt[p]=rand()<<|rand();
siz[p]=;
ch[p][]=ch[p][]=;
return p;
} inline void print(int x){
if(!x) return;
print(ch[x][]);
printf("##%d %d %d %d %d %d\n",x,val[x],rdt[x],siz[x],ch[x][],ch[x][]);
print(ch[x][]);
} inline void update(int x){siz[x]=+siz[ch[x][]]+siz[ch[x][]];} inline void splitbyrnk(int x,int &l,int &r,int k){
if(!k) l=,r=x;
else if(k==siz[x]) l=x,r=;
else if(k<=siz[ch[x][]]) r=x,splitbyrnk(ch[x][],l,ch[x][],k),update(x);
else l=x,splitbyrnk(ch[x][],ch[x][],r,k-siz[ch[x][]]-),update(x);
} inline void splitbyval(int x,int &l,int &r,int k){ //等于的归右面
if(!x) l=r=;
else if(k<=val[x]) r=x,splitbyval(ch[x][],l,ch[x][],k),update(x);
else l=x,splitbyval(ch[x][],ch[x][],r,k),update(x);
} inline void merge(int &x,int l,int r){
if(!l||!r) x=l+r;
else if(rdt[l]<rdt[r]) x=l,merge(ch[x][],ch[x][],r),update(x);
else x=r,merge(ch[x][],l,ch[x][]),update(x);
} inline void insert(int x){
int p=newnode(x);
int l,r;splitbyval(root,l,r,x);
merge(r,p,r);
merge(root,l,r);
} inline void del(int x){
int l,r;splitbyval(root,l,r,x);
int p;splitbyrnk(r,p,r,);
merge(root,l,r);
} inline int getrnk(int x){
int l,r;splitbyval(root,l,r,x);
int re=siz[l];
merge(root,l,r);
return re+;
} inline int getval(int x){
int l,r;splitbyrnk(root,l,r,x-);
int p;splitbyrnk(r,p,r,);
int re=val[p];
merge(r,p,r);merge(root,l,r);
return re;
} inline int getpre(int x){
return getval(getrnk(x)-);
} inline int getnxt(int x){
return getval(getrnk(x+));
} int main(){
//freopen("","r",stdin);
root=newnode(1e9);
N=rd();
for(int i=;i<=N;i++){
int op=rd(),x=rd();
if(op==) insert(x);
else if(op==) del(x);
else if(op==) printf("%d\n",getrnk(x));
else if(op==) printf("%d\n",getval(x));
else if(op==) printf("%d\n",getpre(x));
else printf("%d\n",getnxt(x));
}
return ;
}
[模板]fhqTreap的更多相关文章
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- Luogu3835 【模板】可持久化平衡树(fhq-treap)
fhq-treap,也即非旋treap,可以在不进行旋转操作的前提下维护treap.由于不需要旋转,可以对其可持久化. fhq-treap的基本操作是merge和split,并且通过这两个操作实现对t ...
- fhq-treap模板
模板保存. #include<iostream> #include<cstdio> #include<cstring> #include<ctime> ...
- [luogu3391] 【模板】文艺平衡树(fhq-treap反转区间)
解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- [luogu3369]普通平衡树(fhq-treap模板)
解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- P3369 【模板】普通平衡树FHQtreap
P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...
- Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)
注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- Luogu P3391 【模板】文艺平衡树(FHQ-Treap)
题意 给出一个长为$n$序列$[1,2,...,n]$,$m$次操作,每次指定一段区间$[l,r]$,将这段区间翻转,求最终序列 题解 虽然标题是$Splay$,但是我要用$FHQ\ Treap$,考 ...
- bzoj 1251: 序列终结者 平衡树,fhqtreap
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...
随机推荐
- android 资源
在进行APP开发的过程当中,会用到许多资源,比如:图片,字符串等.现对android资源知识进行简单记录. 具体的详细信息及用法,点击查看官方文档 分类 一般android资源分为可直接访问 ...
- 最新阿里Java技术面试题,看这一文就够了!
金三银四跳槽季即将到来,作为 Java 开发者你开始刷面试题了吗?别急,小编整理了阿里技术面试题,看这一文就够了! 阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战 ...
- 修改phpcms中的评论样式
phpcms中自带的评论插件很好用!但是样式个人感觉丑的狠,百度一下也没能找到解决方式,也许是自己的搜索方式不对,于是自己就研究了研究,这里可以使用两种方法进行修改 方法一: 使用PHPCMS中的ge ...
- jQuery内容过滤选择器与子元素过滤选择器用法实例分析
jQuery选择器内容过滤 一.:contains(text) 选择器::contains(text)描述:匹配包含给定文本的元素返回值:元素集合 示例: ? 1 2 $("div.mini ...
- WEB前端学习资源清单
常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...
- cesium 之三维漫游飞行效果实现篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- 二进制安装 mariadb
默认路径安装MySQL,Mariadb 非常简单,解压,配置权限,修改配置文件基本即可使用:自定义安装稍微有点麻烦,需要修改的地方稍微多点: 下面详细介绍自定义目录,二进制安装mariadb, 使用传 ...
- Java 环境下载设置
本篇文章出处: http://www.cnblogs.com/xiaofeixiang/p/4085159.html 和 https://www.cnblogs.com/renqiqiang/p/68 ...
- RESTful学习及应用
原文转自前端路上,转载请注明出处:http://refined-x.com/2017/09/22/RESTful学习及应用/ RESTful是什么 RESTful是一种API架构,符合REST设计原则 ...
- 基于jQuery实现简单的js模块化
在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...