fhq Treap(无旋Treap)
先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸。
昨天treap就搞了一下午,感觉自己弱爆了。然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz。
所以写个博客防止自己忘了吧(其实就是贴个代码)。
其实fhq treap中最重要的操作就是split和merge,这样就避免了普通treap中的zig和zag,而且各种查询十分方便,基本查个排名就出来了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+;
int root,tot;
struct Treap{
int l,r,dat,val,size;
}tr[N];
void update(int p){tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+;}
int New(int val){
int x=++tot;
tr[x].val=val;
tr[x].dat=rand();
tr[x].size=;
return x;
}
void merge(int &root,int a,int b){
if(!a||!b){
root=a+b;
return ;
}
if(tr[a].dat<tr[b].dat){//a shi baba
root=a;
merge(tr[root].r,tr[a].r,b);
}
else{
root=b;
merge(tr[root].l,a,tr[b].l);
}
update(root);
}
void split(int x,int &a,int &b,int val){
if(!x){
a=b=;
return ;
}
if(tr[x].val<=val){
a=x;
split(tr[x].r,tr[a].r,b,val);
}
else{
b=x;
split(tr[x].l,a,tr[b].l,val);
}
update(x);
}
int getrankbyval(int &root,int val){
int x=,y=;
split(root,x,y,val-);
int ans=tr[x].size+;
merge(root,x,y);
return ans;
}
int getvalbyrank(int &root,int rank){
int x=root;
while(tr[tr[x].l].size+!=rank){
if(rank<=tr[tr[x].l].size) x=tr[x].l;
else rank-=(tr[tr[x].l].size+),x=tr[x].r;
}
return tr[x].val;
}
void insert(int &root,int val){
int x=,y=;
split(root,x,y,val);
merge(x,x,New(val));
merge(root,x,y);
}
void remove(int &root,int val){
int x=,y=,z=;
split(root,x,y,val);
split(x,x,z,val-);
merge(z,tr[z].l,tr[z].r);
merge(x,x,z);
merge(root,x,y);
}
int pre(int &root,int val){
int x=,y=;
split(root,x,y,val-);
int ans=getvalbyrank(x,tr[x].size);
merge(root,x,y);
return ans;
}
int next(int &root,int val){
int x=,y=;
split(root,x,y,val);
int ans=getvalbyrank(y,);
merge(root,x,y);
return ans;
}
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==) insert(root,x);
else if(opt==) remove(root,x);
else if(opt==) printf("%d\n",getrankbyval(root,x));
else if(opt==) printf("%d\n",getvalbyrank(root,x));
else if(opt==) printf("%d\n",pre(root,x));
else if(opt==) printf("%d\n",next(root,x));
}
}
明天考试,我好慌,我好慌。
马上分机房,我肯定去菜机房了,我好慌,我好慌。
加油吧,为了自己的梦想
Mi corazón pertenece a Barcelona para siempre.
fhq Treap(无旋Treap)的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- HNOI2012 永无乡 无旋Treap
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- 无旋treap的区间操作实现
最近真的不爽...一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h... 一道不错的自虐题... 由于这一片主要讲思想,代码我放这里了 不会无旋treap的童鞋可以进这里 呵呵... ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
随机推荐
- Q函数的使用
""" Q函数的使用"""# 查询username 或者nicjname 都为zhangsan 的用户# user_list = Weibo ...
- Redis迁移键
迁移键: move key db 用于在Redis内部进行数据迁移 dump key + restore key ttl value 可以实现在不同的Redis实例之间进行数据迁移 127.0.0.1 ...
- T100错误信息提示方式
例如: IF g_browser_cnt = THEN INITIALIZE g_errparam TO NULL LET g_errparam.extend = "" LET g ...
- WCF寄宿windows服务二
如果有很多WCF服务需要寄宿,需要额外做一些工作:总体思路是:先把这些WCF服务的程序集打包,然后利用反射加载各个WCF服务的程序集,按顺序一个一个寄宿.先来看看我们需要寄宿的WCF服务: 实现步骤: ...
- Tika检测文件类型
Tika类型检测 Tika支持MIME所提供的所有互联网媒体文件类型.每当一个文件通过Tika检测到该文件,其文件类型.检测的介质类型,Tika内部通过以下机制. MIME标准 多用途Internet ...
- java 计算中位数方法
最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数: 中位数就是中间的那个数, 如果一个集合是奇 ...
- js之数据类型(对象类型——构造器对象——数组1)
数组是值的有序集合,每个值叫做一个元素,而每一个元素在数组中有一个位置,以数字表示,称为索引.JavaScript数组是无类型的,数组元素可以是任意类型且同一个数组中不同元素也可能有不同的类型.数组的 ...
- Intellij IDEA导入java项目看不到左边的项目目录结构
1 重新import项目 然后导入完成,就可以了,再不行的话,删除.idea文件,重新import整个Project
- 第九章· MySQL的备份和恢复
一.备份的原因 运维工作的核心简单概括就两件事: 1)第一个是保护公司的数据. 2)第二个是让网站能7*24小时提供服务(用户体验).  备份的原因 1)备份就是为了恢复. 2)尽量减少数据的丢失( ...
- STM32WB 振荡器与时钟
一.振荡器类型与配置 1.振荡器类型:LSE.LSI1.LSI2.MSI.HSI.HSI48.HSE 2.MX中的振荡器配置 3.代码配置样例 RCC_OscInitStruct.Oscillator ...