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 ...
随机推荐
- rem布局,flexible.js
//author:caibaojian //website:http://caibaojian.com //weibo:http:weibo.com/kujian //这段js的最后面有两个参数记得要 ...
- webpack学习三——output
output的两个参数filename,path 一.path输出路径,输出路径要绝对路径,否则报错.做法如下: path:__dirname + 'path' 二.filename 输出文件命,相对 ...
- 【Pyton】【小甲鱼】类和对象
一.类 定义一个类,例子如下: class Turtle: #定义一个名为Turtle的类,Python中类型约定以大写字母开头 #属性 color='green' weight=10 legs=4 ...
- jquery两稳定版本比较~~
jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的发生.评估一个版本是否适合当前开发场景使 ...
- [django]celery_redis探索
celery+redis能做什么及简单原理 能干嘛: 看这里http://yshblog.com/blog/163 https://segmentfault.com/a/119000001565487 ...
- 使用Python2.7 GET Onenet平台的数据
效果 代码 # -*- coding: utf-8 -*- """ ------------------------------------------------- F ...
- nodejs 将网上的图片下载到本地文件
var request = require('request'); var fs = require('fs'); var img_src = 'https://www.baidu.com/img/b ...
- python接口自动化-参数化
原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...
- jmeter bean shell断言加密的响应信息(加密接口测试二)
断言加密的响应信息 1.在http请求-->添加-->断言-->bean shell 断言 import com.changfu.EncryptAndDecryptInterface ...
- VMware Coding Challenge: Removing Duplicates Entries
static LinkedListNode removeDuplicates(LinkedListNode list) { LinkedListNode cur = list; HashSet< ...