fhq treap抄袭笔记
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抄袭笔记的更多相关文章
- fhq treap 学习笔记
序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...
- FHQ treap学习(复习)笔记
.....好吧....最后一篇学习笔记的flag它倒了..... 好吧,这篇笔记也鸽了好久好久了... 比赛前刷模板,才想着还是补个坑吧... FHQ,这个神仙(范浩强大佬),发明了这个神仙的数据结构 ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
- 「学习笔记」 FHQ Treap
FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...
- Fhq Treap [FhqTreap 学习笔记]
众所周知 Fhq Treap 是 fhq 神仙研究出来的平衡树- 具体实现 每个点实现一个 \(\text{rnd}\) 表示 rand 的值 为什么要 rand 呢 是为了保证树高为 \(\log ...
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【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 ...
- 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 15112 Solved: 4996[Submit][Statu ...
随机推荐
- sql根据某一个字段重复只取第一条数据
比如上图,取3,4行记录的第一行也就是3行,而不返回4行. 使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值 ...
- Is It A Tree?----poj1308
http://poj.org/problem?id=1308 #include<stdio.h> #include<string.h> #include<iostream ...
- EControl平台测试向生产版本工程切换说明
第一步,备份生产环境版本,假设生产环境版本工程名为SEHEControl,记录版本说明第二部,拷贝测试版本到新文件夹,假设测试版本工程名为SEHEControlTest第三步,进入工程文件夹,修改SL ...
- 程序猿职业生涯中的 Norris 常数
我的朋友Clift Norris发现了一个基本常数.我称之为Norris常数,一个未经培训的程序猿在他或她遇到瓶颈之前能写出的平均代码量.Clift预计这个值是1500行. 超过这个数以后,代码会变得 ...
- .NET Core 2.0 官方下载地址及中文教程
开发.net core 应用需要安装.NET Core 2.0 SDK http://www.microsoft.com/net/download/core#/sdk 电脑上运行 .net core ...
- word自动导入目录
1:如果在编写word时,有给各章添加标题,可以使用word的目录生成功能,如图:
- 杀死正在运行的进程: linux
1:杀死正在运行的进程:使用ps -aux|grep labor 查出进程PID 2:使用kill PID 将进程杀死.
- Ubuntu 14.04 安装 SteamOS 会话
如何在Ubuntu 14.04上安装steamos会话,以使用户的SteamOS 大图片模式直接从lightdm GTK迎宾开始进入. SteamOS是一个开源的基于Debian Wheezy分支的. ...
- dedecms开启多站点
dedecms开启多站点后,填写域名才能正确的地址 if ( ! function_exists('GetFileUrl')) { function GetFileUrl($aid,$typeid,$ ...
- jQuery Mobile 和 Kendo UI 的比较(转)
jQuery Mobile 和 Kendo UI 的比较 转自 https://www.oschina.net/translate/jquery-mobile-versus-kendo-ui?cmp ...