Luogu P3835 【模板】可持久化平衡树(fhq Treap)
题意
题目背景
本题为题目普通平衡树的可持久化加强版。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本):
- 插入\(x\)数
- 删除\(x\)数(若有多个相同的数,因只删除一个,如果没有请忽略该操作)
- 查询\(x\)数的排名(排名定义为比当前数小的数的个数\(+1\)。若有多个相同的数,因输出最小的排名)
- 查询排名为x的数
- 求\(x\)的前驱(前驱定义为小于\(x\),且最大的数,如不存在输出\(-2147483647\))
- 求\(x\)的后继(后继定义为大于\(x\),且最小的数,如不存在输出\(2147483647\))
和原本平衡树不同的一点是,每一次的任何操作都是基于某一个历史版本,同时生成一个新的版本。(操作\(3,4,5,6\)即保持原版本无变化)
每个版本的编号即为操作的序号(版本\(0\)即为初始状态,空树)
输入输出格式
输入格式:
第一行包含一个正整数\(N\),表示操作的总数。
接下来每行包含三个整数,第\(i\)行记为\(v_i,opt_i,x_i\)。
\(v_i\)表示基于的过去版本号\((0\leq v_i<i)\),\(opt_i\)表示操作的序号\((1\leq opt\leq 6)\),\(x_i\)表示参与操作的数值。
输出格式:
每行包含一个正整数,依次为各个\(3,4,5,6\)操作所对应的答案
输入输出样例
输入样例#1:
10
0 1 9
1 1 3
1 1 10
2 4 2
3 3 9
3 1 2
6 4 1
6 2 9
8 6 3
4 5 8
输出样例#1:
9
1
2
10
3
说明
数据范围:
对于\(28%\)的数据满足:\(1\leq n\leq 10\)
对于\(44%\)的数据满足:\(1\leq n\leq 2\cdot {10}^2\)
对于\(60%\)的数据满足:\(1\leq n\leq 3\cdot {10}^3\)
对于\(84%\)的数据满足:\(1\leq n\leq {10}^5\)
对于\(92%\)的数据满足:\(1\leq n\leq 2\cdot {10}^5\)
对于\(100%\)的数据满足:\(1\leq n\leq 5\cdot {10}^5\)
经实测,正常常数的可持久化平衡树均可通过,请各位放心
样例说明:
共\(10\)次操作,\(11\)个版本,各版本的状况依次是:
- \([]\)
- \([9]\)
- \([3,9]\)
- \([9,10]\)
- \([3,9]\)
- \([9,10]\)
- \([2,9,10]\)
- \([2,9,10]\)
- \([2,10]\)
- \([2,10]\)
- \([3,9]\)
思路
\(fhq\ Treap\)天下第一! --Uranus
在可持久化的状况下,\(fhq\ Treap\)的优越性被发挥得淋漓尽致。总体函数完全没有变化,只是多加了几条新建点的语句:
int merge(int x,int y)
{
if(!x||!y) return x+y;
if(rnd(x)>rnd(y))
{
int p=++cnt;node[p]=node[x];//new
rs(p)=merge(rs(p),y);
update(p);
return p;
}
else
{
int p=++cnt;node[p]=node[y];//new
ls(p)=merge(x,ls(p));
update(p);
return p;
}
}
void split(int now,int k,int &x,int &y)
{
if(!now) x=y=0;
else
{
if(val(now)<=k)
{
x=++cnt;node[x]=node[now];//new
split(rs(x),k,rs(x),y);
update(x);
}
else
{
y=++cnt;node[y]=node[now];//new
split(ls(y),k,x,ls(y));
update(y);
}
}
}
上面代码标了new的就是新语句。
其他的操作完全相同,访问历史版本的操作也只需要对于每一个版本根不相同就可以了。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int INF=2147483647;
const int MAXN=5e5+5;
int n,cnt,rt[MAXN];
struct fhq_Treap
{
int sz,rnd,val;
int ls,rs;
#define sz(a) node[a].sz
#define rnd(a) node[a].rnd
#define val(a) node[a].val
#define ls(a) node[a].ls
#define rs(a) node[a].rs
}node[MAXN<<6];
int read()
{
int re=0;bool f=true;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=false;ch=getchar();}
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return f?re:-re;
}
int newnode(int k)
{
sz(++cnt)=1;
rnd(cnt)=rand();
val(cnt)=k;
return cnt;
}
void update(int p){sz(p)=sz(ls(p))+sz(rs(p))+1;}
int merge(int x,int y)
{
if(!x||!y) return x+y;
if(rnd(x)>rnd(y))
{
int p=++cnt;node[p]=node[x];
rs(p)=merge(rs(p),y);
update(p);
return p;
}
else
{
int p=++cnt;node[p]=node[y];
ls(p)=merge(x,ls(p));
update(p);
return p;
}
}
void split(int now,int k,int &x,int &y)
{
if(!now) x=y=0;
else
{
if(val(now)<=k)
{
x=++cnt;node[x]=node[now];
split(rs(x),k,rs(x),y);
update(x);
}
else
{
y=++cnt;node[y]=node[now];
split(ls(y),k,x,ls(y));
update(y);
}
}
}
int kth(int now,int k)
{
if(k==sz(ls(now))+1) return val(now);
else if(k<=sz(ls(now))) return kth(ls(now),k);
else return kth(rs(now),k-sz(ls(now))-1);
}
int main()
{
srand(time(0));
n=read();
for(int i=1;i<=n;i++)
{
int ver=read(),opt=read(),k=read();rt[i]=rt[ver];
if(opt==1)
{
int x,y;
split(rt[i],k,x,y);
rt[i]=merge(merge(x,newnode(k)),y);
}
else if(opt==2)
{
int x,y,z;
split(rt[i],k,x,z);
split(x,k-1,x,y);
y=merge(ls(y),rs(y));
rt[i]=merge(merge(x,y),z);
}
else if(opt==3)
{
int x,y;
split(rt[i],k-1,x,y);
printf("%d\n",sz(x)+1);
rt[i]=merge(x,y);
}
else if(opt==4) printf("%d\n",kth(rt[i],k));
else if(opt==5)
{
int x,y;
split(rt[i],k-1,x,y);
if(!x) printf("%d\n",-INF);
else printf("%d\n",kth(x,sz(x)));
rt[i]=merge(x,y);
}
else if(opt==6)
{
int x,y;
split(rt[i],k,x,y);
if(!y) printf("%d\n",INF);
else printf("%d\n",kth(y,1));
rt[i]=merge(x,y);
}
}
return 0;
}
Luogu P3835 【模板】可持久化平衡树(fhq Treap)的更多相关文章
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
- P3391 【模板】文艺平衡树FHQ treap
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
随机推荐
- Android开发 AAC的ADTS头解析[转载]
原文地址:https://www.jianshu.com/p/b5ca697535bd 1. ADTS(Audio Data Transport Stream)头之于AAC AAC音频文件的每一帧都由 ...
- Excel-根据分隔符将一个单元格的内容分发到多个单元格
A1 1:2:3:4:5:6:7::::10 现在想将A1根据";"进行分离,再讲分离出来的一个值填到一个单元格中 =TRIM(MID(SUBSTITUTE($A$12," ...
- 登录操作(方法一:设置flag标志位)
登录操作(方法一:设置flag标志位) user_name="star"passwoed='123'passed_authentication=Falsecount=0for i ...
- Socket.EndReceive 方法 (IAsyncResult)
.NET Framework (current version) 其他版本 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 . ...
- 理解云计算三种服务模式——IaaS、PaaS和SaaS
云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类: SaaS(Software as a Service–软件即服务) PaaS(Platform as a Ser ...
- Hexo 博客图片添加至图床---腾讯云COS图床使用。
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 腾讯云官网 登录注册 创建存储桶 进入上面的存 ...
- 夏令营501-511NOIP训练16——数字转换
传送门:QAQQAQ 题意:如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和:如果对于某个y>x且y的约数和为x,那么x也可以变成y.例如,4可以变为3,1可以变为 ...
- 基于VGGnet的人脸识别系统-ubuntu 系统下的Caffe环境搭建(CPU)
对于caffe的系统一般使用linux系统,当然也有windows版本的caffe,不过如果你一开始使用了windows下面的caffe,后面学习的过程中,会经常遇到各种错误,网上下载的一些源码.模型 ...
- [NOIP2019模拟赛]LuoguP4261白金元首与克劳德斯
题目描述 给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\ ...
- HTML5 上传图片预览
html5出现之前如果需要上传图片预览 一般都是先上传到服务器然后远程预览 html5出现之后 有个filereader 解决了这问题 //选中图片之后 $("#fileAddPic&q ...