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 您需要写一种数据结构(可参考题目标题),来维护一个 ...
随机推荐
- 01满包加记录最小路劲 L3-001. 凑零钱
过了这么久 正确理解01背包应该从记忆化搜索开始 这里对数字的取或者不取实际上就是一个01背包的模型 不过这里要求的是满包问题 那么我们动态便利的过程需要做一点 处理只有从0开始的能够向上更新 在就是 ...
- 解决maven依赖包下载慢的问题
修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...
- 【原创】运维基础之Amplify
官方:https://www.nginx.com/products/nginx-amplify/ NGINX Amplify is a SaaS‑based monitoring tool for t ...
- Kendall tau距离(即两个内容相同的数组中逆序数对的数量)(算法》P220 第2.5.3.2小节)
一组排列就是一组N个整数的数组,其中0~N-1的每个数都只出现一次.两个排列之间的 Kendall tau距离就是在两组排列中相对顺序不同的数对的数目.例如,0 3 1 6 2 5 4和1 0 3 6 ...
- 常见DML语句汇总
DML操作是指对数据中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查询(select),是开发人员日常使用最频繁的操作,下面依次对它们进行介绍. ( ...
- 深入分析 Docker 镜像原理
摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...
- C# Monitor Wait()和Pulse()
C# Monitor Wait()和Pulse() 1.Monitor.Wait方法当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有 ...
- springboot搭建web项目与使用配置文件
目录 一.准备工作 二.创建基础web项目 1. maven配置 2.创建maven项目.配置pom.xml为web基础项目 3.编写启动类 4.使用maven打包 5.使用命令java -jar x ...
- 平时工作常用linux命令总结
mkdir 创建目录 make dir cp 拷贝文件 copy mv 移动文件 move rm 删除文件 remove # 创建连级目录 mkdir -p a/b/c # 拷贝文件夹a到文 ...
- selectpage
官方文档地址 https://terryz.oschina.io/selectpage/docs.html