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. mysql 数据操作 多表查询 子查询 带IN关键字的子查询

    1 带IN关键字的子查询 #查询平均年龄在25岁以上的部门名关键点部门名 以查询员工表的dep_id的结果 当作另外一条sql语句查询条件使用 in (sql语句) mysql ; +-------- ...

  2. CSS分列等高

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. MySQL · 功能分析 · 5.6 并行复制实现分析

    背景 我们知道MySQL的主备同步是通过binlog在备库重放进行的,IO线程把主库binlog拉过去存入relaylog,然后SQL线程重放 relaylog 中的event,然而这种模式有一个问题 ...

  4. SQLCE数据工具(Flyhoward Ltd SDF Viewer)

    SDF Viewer sdf数据库创建编辑查看 官方下载地址  http://www.flyhoward.com/Download_SDF_Viewer.aspx 用户名:www.cr173.com注 ...

  5. CMSPRESS-PHP无限级分类

    原博文地址:http://blog.sina.com.cn/s/blog_75ad10100101mrv0.html 当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还 ...

  6. [py]flask从0到1-模板/增删改查

    flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ...

  7. Word转换为markdown

    Word转换为markdown 首先你的电脑要有office word 1   安装pandoc https://github.com/jgm/pandoc/releases,可以找到最新的pando ...

  8. jconsole监控远程 spring boot程序

    监控java 程序 增加启动参数 java  \ -Djava.rmi.server.hostname=192.168.1.97 \ -Dcom.sun.management.jmxremote \- ...

  9. 从Maven仓库中导出jar包

    从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib更简单的 ...

  10. linux mail 发送邮件附件

    在很多场景中我们会使用Shell命令来发送邮件,而且我们还可能在邮件里面添加附件,本文将介绍使用Shell命令发送带附件邮件的几种方式,希望对大家有所帮助. 文章目录 1 使用mail命令 2 使用m ...