用途

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

原理

和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. 调用链监控 CAT 之 URL埋点实践

    URL监控埋点作用 一个http请求来了之后,会自动打点,能够记录每个url的访问情况,并将以此请求后续的调用链路串起来,可以在cat上查看logview 可以在cat Transaction及Eve ...

  2. 重拾《 两周自制脚本语言 》- Eclipse插件实现语法高亮

    源码库: program-in-chinese/stone-editor-eclipse 参考: FAQ How do I write an editor for my own language? D ...

  3. 【Android】用Cubism 2制作自己的Live2D——android sdk样本的下载与Android studio编译!

    前言- 在浏览Live2d说明书的时候我无意中发现了一个有趣的东西,就是android sdk中居然自带动态壁纸!那就让我们来试试吧,说明书此页的网址连接——中文版||日文版 Android开发所必需 ...

  4. Android为TV端助力转载:码农小阿飞(SpannableString)

    用SpannableString打造绚丽多彩的文本显示效果 引语 TeXtView大家应该都不陌生,文本展示控件嘛! 就用TextView显示普普通通的文本,OK,很简单,Android入门的都会,没 ...

  5. swing Jframe 界面风格

    用法:在jframe里面 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel" ...

  6. 从0开始的Python学习012数据结构&对象与类

    简介 数据结构是处理数据的结构,或者说,他们是用来存储一组相关数据的. 在Python中三种内建的数据结构--列表.元组和字典.学会了使用它们会使编程变得的简单. 列表 list是处理一组有序的数据结 ...

  7. 利用ZYNQ SOC快速打开算法验证通路(6)——利用AXI总线实时配置sysGen子系统

    利用ZYNQ验证算法的一大优势在于,可以在上位机发送指令借助CPU的控制能力和C语言易开发特点,实时配置算法模块的工作模式.参数等对来对其算法模块性能进行全面的评估.最重要的是无需重新综合硬件模块. ...

  8. composer包(发布到github上)同步到Packagist

    在上一篇文章里面,探讨了如何一步步建立composer包–创建你的一个composer包 创建完成后,我们需要做的就是讲自建的包发布到Packagist上.至于说什么是Packagist,这个就不用我 ...

  9. SQL 游标的使用

    适用场景:对查询出的结果集遍历,作用类似于其他语言的列表循环语句. 相关语法: --定义游标 DECLARE cr CURSOR FOR( SELECT Cust_ID ,Cust_Name ,IDC ...

  10. 前端架构师 摘自《前端架构设计》-micah godbolt

    作为前端架构师,你经常需要制定,或至少能够掌握以上所列的每一项内容.流程中的任何一个环节出现问题,都会迅速演变为开发人员的痛苦,或者导致网站无法持续满足用户要求,甚至崩溃.  前端架构师的用户是开发人 ...