用途

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

原理

和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. js或jquery实现点击某个按钮或元素显示div,点击页面其他任何地方隐藏div

    点击某个元素显示div,点击页面其他任何地方隐藏div,可用javascript和jquery两种方法实现: 一:javascript实现方法技巧<script>//定义stopPropa ...

  2. Php7.3 could not find driver

    今天phpstudy升级php7.3,发现框架报错:could not find driver,后来发现默认php.ini的配置有几个是注释掉的,配置php.ini,修改如下 extension=my ...

  3. Java 创建、填充PDF表单域

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  4. jQuery(三)、属性、CSS

    jQuery设置了很多为标签进行属性的操作,比如添加.删除. 一 .属性 1 attr(name | properties | [key, value | fn]) 设置或返回被选择的属性值. 参数: ...

  5. web.xml的<url-parttern>的匹配规则

    <url-parttern>顾名思义是对url(统一资源定位符)的一种匹配,是对“http:........."地址的匹配,但是会减去应用上下文,就是你的web程序的名字,如果你 ...

  6. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  7. glibc溢出提权CVE-2018-1000001总结

    遇到了好几个centos6.5,一直尝试想提权.暂未成功,靶机内核:2.6.32-696.18.7.el6.x86_64. glibc版本:ldd (GNU libc) 2.12 目前编译过程中都发现 ...

  8. 46.Odoo产品分析 (五) – 定制板块(2) – 为业务自定义odoo(1)

    查看Odoo产品分析系列--目录 在这一章节中,将学习到如何设置"开发者模式"以及备份数据库:然后学习如何添加字段到数据库并在表单和视图中显示. 1 了解odoo的构架 每一个应用 ...

  9. WebApi接收post方式传入的json数据

    [RoutePrefix("Api")] public class UploadController:BaseApiController { [HttpPost] [Route(& ...

  10. LeetCode算法题-Find Pivot Index(Java实现)

    这是悦乐书的第304次更新,第323篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第172题(顺位题号是724).给定一个整数nums数组,编写一个返回此数组的" ...