fhq treap

碎碎念

我咋感觉合并这么像左偏树呢

ps:难道你们的treap都是小头堆的吗

fhq真的是神人

现在看以前学的splay是有点恶心,尤其是压行压不过fhqtreap

点一下

fhq treap主要操作就俩

拆(merge)和合(split)

其他操作都是基于这俩操作(拆拆合合,合拆合拆,拆了又和,合了又拆)

合并操作merge

把两颗树合并成一颗

这里的两颗树x,y,满足x树小于y树

因为要保证堆的性质

	if(!x||!y) return x+y;//必有一颗为空,所以直接返回那颗不空树即可
if(pri[x]<pri[y]) {//这里x为根,因为x树<y树,所以y一定在x的右孩子中
ch[x][1]=merge(ch[x][1],y);
pushup(x);//更新size
return x;
} else {//类似的,自己想
ch[y][0]=merge(x,ch[y][0]);//这里的merge顺序千万不要颠倒,因为要x树<y树
pushup(y);
return y;
}
}

拆分操作split

以一个基准数拆分

不太会说,不说了,自己去领悟吧

其他操作看这里

注意!!!

k_th的时候一定要记得去减去左边的size

模板

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=100007;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int ch[maxn][2],siz[maxn],val[maxn],pri[maxn],cnt;
void pushup(int x) {
siz[x]=1+siz[ch[x][0]]+siz[ch[x][1]];
}
int make_edge(int x) {
val[++cnt]=x,siz[cnt]=1,pri[cnt]=rand();
return cnt;
}
int merge(int x,int y) {
if(!x||!y) return x+y;
if(pri[x]<pri[y]) {
ch[x][1]=merge(ch[x][1],y);
pushup(x);
return x;
} else {
ch[y][0]=merge(x,ch[y][0]);
pushup(y);
return y;
}
}
void split(int now,int k,int &x,int &y) {
if(!now) x=y=0;
else {
if(val[now]<=k)
x=now,split(ch[now][1],k,ch[x][1],y);
else
y=now,split(ch[now][0],k,x,ch[y][0]);
pushup(now);
}
}
int k_th(int now,int k) {
while(233) {
if(k==siz[ch[now][0]]+1) return now;
if(k<=siz[ch[now][0]]) now=ch[now][0];
else k-=siz[ch[now][0]]+1,now=ch[now][1];
}
}
int main() {
int n=read(),rt=0;
FOR(i,1,n) {
int opt=read(),a=read(),x,y,z;
if(opt==1){
split(rt,a,x,y);
rt=merge(merge(x,make_edge(a)),y);
} else if(opt==2) {
split(rt,a,x,z);
split(x,a-1,x,y);
y=merge(ch[y][0],ch[y][1]);
rt=merge(merge(x,y),z);
} else if(opt==3) {
split(rt,a-1,x,y);
printf("%d\n",siz[x]+1);
rt=merge(x,y);
} else if(opt==4) {
printf("%d\n",val[k_th(rt,a)]);
} else if(opt==5) {
split(rt,a-1,x,y);
printf("%d\n",val[k_th(x,siz[x])]);
rt=merge(x,y);
} else if(opt==6) {
split(rt,a,x,y);
printf("%d\n",val[k_th(y,1)]);
rt=merge(x,y);
}
}
return 0;
}

fhq treap抄袭笔记的更多相关文章

  1. fhq treap 学习笔记

    序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...

  2. FHQ treap学习(复习)笔记

    .....好吧....最后一篇学习笔记的flag它倒了..... 好吧,这篇笔记也鸽了好久好久了... 比赛前刷模板,才想着还是补个坑吧... FHQ,这个神仙(范浩强大佬),发明了这个神仙的数据结构 ...

  3. 「FHQ Treap」学习笔记

    话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...

  4. 「学习笔记」 FHQ Treap

    FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...

  5. Fhq Treap [FhqTreap 学习笔记]

    众所周知 Fhq Treap 是 fhq 神仙研究出来的平衡树- 具体实现 每个点实现一个 \(\text{rnd}\) 表示 rand 的值 为什么要 rand 呢 是为了保证树高为 \(\log ...

  6. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  7. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  8. 【POJ2761】【fhq treap】A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  9. 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 15112  Solved: 4996[Submit][Statu ...

随机推荐

  1. ViewPager的OnPageChangeListener三个回调解析

    一个native crash最后是重写ViewPager解决的,过程中发现这三个回调还有点绕,于是理了一下 ViewPager有两个操作,一个是用手指滑动翻页,一个是直接setCurrentItem( ...

  2. Inception系列

    从GoogLeNet的Inceptionv1开始,发展了众多inception,如inception v2.v3.v4与Inception-ResNet-V2. 故事还是要从inception v1开 ...

  3. end=‘’

    print('----------------') a = ['aa','bb','cc','dd','ee'] for i in range(len(a)): print(i,a[i])#默认换行 ...

  4. testng入门教程7 TestNG组测试

    在TestNG中组测试是一个新的创新功能,它不存在于JUnit框架,它允许调度到适当的部分方法和瓶坯复杂的测试方法分组.您不仅可以声明属于群体的那些方法,但你也可以指定一组包含其他组.然后,TestN ...

  5. tfs代码上传到server并下载到新位置

    1.svn与git代码管理原理基本一致,基于文档管理,能看到文件代码,通过设置文件的只读属性来控制代码. 而tfs是基于sqlserver及lock来管理,看不见代码文件 2.tfs没有自己的用户管理 ...

  6. 007-配置IP和DNS

    2.配置DNS. 3.

  7. cxf-webservice完整示例

    最近一段时间研究webservice,一般来说,开发java的Webservice经常使用axis2和cxf这两个比较流行的框架 先使用cxf,开发一个完整示例,方便对webservice有一个整体的 ...

  8. Perl中的输入输出流(三)

    Perl中读取标准输入:<STDIN> foreach (<STDIN>)  { print "I saw $_";} 钻石操作符<>:它的参数 ...

  9. rpgmakermv(6) YEP_ItemSynthesis.js物品合成插件

    物品合成插件. 用途?太多了呢. 低级宝石合成高级,还有装备,武器,药水等等. ============================================================ ...

  10. fontawesome与amazeUI

    fontawesome是很不错的东西呢~~~~ amazeUI也是很不错的东西呢~~~~~ 最近一年里,比较偏爱这两个家伙? 什么?为什么bootstrap?有什么区别? 这个我还真说不太清楚. 用一 ...