fhq-treap模板
模板保存。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 500001
using namespace std;
typedef long long ll;
int size[maxn],ch[maxn][],rnd[maxn],val[maxn],rev[maxn];
int ncnt,x,y,z,rt,n,m; inline void pushup(int x){
size[x]=+size[ch[x][]]+size[ch[x][]];
} inline void pushdown(int rt){
if(rev[rt]){
swap(ch[rt][],ch[rt][]);
if(ch[rt][]) rev[ch[rt][]]^=;
if(ch[rt][]) rev[ch[rt][]]^=;
rev[rt]=;
} } inline int new_node(int x){
size[++ncnt]=;
val[ncnt]=x;
rnd[ncnt]=rand();
return ncnt;
}
//核心
int merge(int A,int B){
if(!A||!B) return A+B;
if(rnd[A]<rnd[B]){pushdown(A);ch[A][]=merge(ch[A][],B);pushup(A);return A;}
else {pushdown(B);ch[B][]=merge(A,ch[B][]);pushup(B);return B;}
}
//权值分裂 void split_1(int now,int k,int &x,int &y){
if(!now) x=y=;
else{
pushdown(now);
if(val[now]<=k) x=now,split_1(ch[now][],k,ch[now][],y);
else y=now,split_1(ch[now][],k,x,ch[now][]);
pushup(now);
}
} //排名分裂 void split_2(int now,int k,int &x,int &y){
if(!now) x=y=;
else{
pushdown(now);
if(k<=size[ch[now][]]){y=now;split_2(ch[now][],k,x,ch[now][]);}
else{x=now;split_2(ch[now][],k-size[ch[now][]]-,ch[now][],y);}
pushup(now);
}
} void insert(int &k,int a){
split_1(k,a,x,y);
k=merge(merge(x,new_node(a)),y);
} //会浪费空间,没有回收节点
void del(int &k,int a){
split_1(k,a,x,z);
split_1(x,a-,x,y);
y=merge(ch[y][],ch[y][]);
k=merge(merge(x,y),z);
} int rnk(int &k,int a){
split_1(k,a-,x,y);
int res=size[x]+;
k=merge(x,y);
return res;
} int kth(int now,int k){
while(){
if(k<=size[ch[now][]]) now=ch[now][];
else if(k==size[ch[now][]]+) return val[now];
else k-=size[ch[now][]]+,now=ch[now][];
}
} int pred(int &k,int a){
split_1(k,a-,x,y);
int res=kth(x,size[x]);
k=merge(x,y);
return res;
} int succ(int &k,int a){
split_1(k,a,x,y);
int res=kth(y,);
k=merge(x,y);
return res;
} void reverse(int &k,int l,int r){
split_2(k,l-,x,y);
split_2(y,r-l+,y,z);
rev[y]^=;
k=merge(x,merge(y,z));
} void print(int &k){
if(!k) return;
pushdown(k);
print(ch[k][]);
if(val[k]>=&&val[k]<=n) printf("%d ",val[k]);
print(ch[k][]);
} int main(){
srand(time());
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) insert(rt,i);
for(int i=,l,r;i<=m;i++){
scanf("%d%d",&l,&r);
reverse(rt,l,r);
}
print(rt);
return ;
}
fhq-treap模板的更多相关文章
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 简析平衡树(四)——FHQ Treap
前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- 洛谷P3369 【模板】普通平衡树(FHQ Treap)
题面 传送门 题解 写了一下\(FHQ\ Treap\) //minamoto #include<bits/stdc++.h> #define R register #define inl ...
- FHQ Treap摘要
原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...
- 在平衡树的海洋中畅游(四)——FHQ Treap
Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...
- 浅谈fhq treap
一.简介 fhq treap 与一般的treap主要有3点不同 1.不用旋转 2.以merge和split为核心操作,通过它们的组合实现平衡树的所有操作 3.可以可持久化 二.核心操作 代码中val表 ...
- FHQ Treap及其可持久化与朝鲜树式重构
FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...
- fhq treap抄袭笔记
目录 碎碎念 点一下 注意!!! 模板 fhq treap 碎碎念 我咋感觉合并这么像左偏树呢 ps:难道你们的treap都是小头堆的吗 fhq真的是神人 现在看以前学的splay是有点恶心,尤其是压 ...
随机推荐
- 使用Android Studio自带的NDK编译JNI
/********************************************************************************** * 使用Android Stud ...
- easyui1.4 汉化出问题
easyui 1.4 的textbox 验证汉化不了,需要在easyui-lang-zh_CN.js 加入 if ($.fn.textbox){ $.fn.textbox.defaults.missi ...
- Android UI之LinearLayout详解
※※※摘自http://www.cnblogs.com/salam/archive/2010/10/20/1856793.html LinearLayout是线性布局控件,它包含的子控件将以横向或竖向 ...
- bzoj 2734 集合选数
Written with StackEdit. Description <集合论与图论>这门课程有一道作业题,要求同学们求出\(\{1, 2, 3, 4, 5\}\)的所有满足以 下条件的 ...
- 关键的OOP概念
OOP的好处 1.封装, 2继承, 3多态. 多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. <? ...
- CF311B Cats Transport
题意 Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straigh ...
- JavaScript 冒号(:)详解
1.switch语句分支 2.?:三元表达式的false 3.声明对象直接量的成员 4.声明标签 1和2相信地球人都知道吧?如果有人不知道,那我改成地球上的程序员都知道,哈哈 3.对象直接量我们也经常 ...
- CLR值类型和引用类型
知识点:引用类型.值类型.装箱.拆箱 CLR支持两种类型:引用类型和值类型.引用类型在堆上分配内存,值类型在线程栈上分配内存.值类型与引用类型如下所示: 值类型对象有两种表示形式:未装箱和已装箱.将一 ...
- FastAdmin 在线命令生成时出错的分析
FastAdmin 在线命令生成时出错的分析 出错现象 版本环境 FastAdmin 版本:1.0.0.20180806_beta 在线命令插件版本:1.0.3 分析 2018-08-13 16:12 ...
- nextSibling VS nextElementSibling
2. nextSibling vs nextElementSibling { //FF { 在Firefox中,link2的nextSibling并不是link3,因为两者之间有一个换行符. 这被认为 ...