用途

平衡树(可实现区间翻转)

原理

和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的更多相关文章

  1. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap

    P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...

  2. Luogu3835 【模板】可持久化平衡树(fhq-treap)

    fhq-treap,也即非旋treap,可以在不进行旋转操作的前提下维护treap.由于不需要旋转,可以对其可持久化. fhq-treap的基本操作是merge和split,并且通过这两个操作实现对t ...

  3. fhq-treap模板

    模板保存. #include<iostream> #include<cstdio> #include<cstring> #include<ctime> ...

  4. [luogu3391] 【模板】文艺平衡树(fhq-treap反转区间)

    解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  5. [luogu3369]普通平衡树(fhq-treap模板)

    解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  6. P3369 【模板】普通平衡树FHQtreap

    P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...

  7. Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)

    注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  8. Luogu P3391 【模板】文艺平衡树(FHQ-Treap)

    题意 给出一个长为$n$序列$[1,2,...,n]$,$m$次操作,每次指定一段区间$[l,r]$,将这段区间翻转,求最终序列 题解 虽然标题是$Splay$,但是我要用$FHQ\ Treap$,考 ...

  9. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

随机推荐

  1. java类与对象(属性,方法)的使用

    ---恢复内容开始--- 类和对象是java编程中很重要的应该面向对象的一课,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语言的基础 ...

  2. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  3. MongoDB学习(配置用户账户和访问控制)

    理解admin数据库 安装MongoDB时,会自动创建admin数据库,这是一个特殊的库.有些用户账户角色赋予用户操作多个数据库的权限,而这些用户只能在admin数据库中创建.要创建有权操作所有数据库 ...

  4. Dynamics 365中显示格式为URL的字段极少部分URL值录入了不显示怎么回事?

    微软动态CRM专家罗勇 ,回复318或者20190315可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 对于如下类型的字段, ...

  5. QC API全系列揭秘之Test Execution操作(全网首发)

    (原创文章,转载请注明出处.) 一.QC简介: Quality Center存在至今已经走过了10多个年头,名字从一开始的TD,到后来的QC,再到现在的ALM.所属公司从开始的Mercury到现在的H ...

  6. 记一次zabbix排错(数据库安装在其它服务器上)

    记一次zabbix排错 故障现象 1.在/var/log/zabbix/zabbix_server.log中出现以下报错: 12106:20190314:090947.010 [Z3001] conn ...

  7. 本地部署JAVA SE环境

    一.下载安装JDK: 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-doc-downloads-2133158. ...

  8. git在开发中的一些使用

    git 获取远程分支: 步骤如下: 首先:git fetch --all 其次:git checkout 分支名 例如:git checkout pmt-45424-TOUCHWEB 这样就可以获取到 ...

  9. LinuxMint(Ubuntu)安装文泉驿家族黑体字

    文泉驿黑体字家族在Ubuntu上很有用,可以解决系统字体发虚的问题. 通过下面的三条命令安装: sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑 sudo ...

  10. 4.16 反射和jvm