题目链接

对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样)。时间空间复杂度都为O(qlogq)。(应该更大些 因为rand()?内存真的爆炸。。)

对于无修改的操作实际上是可以直接赋值的,因为以后也不会去改当前树,只需要查询;修改时自会复制新节点。

虽然操作3.4.5.6不会改变原树,但是Split()会改变树的形态,所以仍要新建节点,但根节点不需要Merge()。

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=5e5+5,S=N*45,INF=0x7fffffff; int root[N];
namespace fhq_Treap
{
#define lson son[rt][0]
#define rson son[rt][1] int tot,fix[S],val[S],son[S][2],sz[S];//必须要*50啊QAQ
inline int New_Node(int v){
val[++tot]=v, fix[tot]=rand(), sz[tot]=1/*sz[]无所谓*/;
return tot;
}
inline void Update(int rt){
sz[rt]=sz[lson]+sz[rson]+1;
}
int Merge(int x,int y)
{//复制出一棵合并后的树并返回
if(!x||!y) return x^y;
if(fix[x]<fix[y])
{
int p=New_Node(val[x]);//复制x的左儿子,更新右儿子
son[p][0]=son[x][0], son[p][1]=Merge(son[x][1],y), Update(p);
return p;
}
else{
int p=New_Node(val[y]);
son[p][1]=son[y][1], son[p][0]=Merge(x,son[y][0]), Update(p);
return p;
}
}
void Split(int rt,int v,int &x,int &y)
{//复制出两棵树来给x,y
if(!rt) x=y=0;
else if(val[rt]<=v){
x=New_Node(val[rt]), son[x][0]=lson, Split(rson,v,son[x][1],y);
Update(x);
}
else{
y=New_Node(val[rt]), son[y][1]=rson, Split(lson,v,x,son[y][0]);
Update(y);
}
}
int Kth(int k,int rt)
{
while(1)
{
if(sz[lson]+1==k) return val[rt];
if(sz[lson]<k) k-=sz[lson]+1, rt=rson;
else rt=lson;
}
}
int Find(int x,int w)
{
if(!x) return w?INF:-INF;
while(son[x][w]) x=son[x][w];
return val[x];
}
}
using namespace fhq_Treap; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
} int main()
{
int q=read();
for(int ver,opt,val,x,y,z,i=1; i<=q; ++i)
{
switch(ver=read(),opt=read(),val=read(),opt)
{ case 1: Split(root[ver],val,x,y),root[i]=Merge(Merge(x,New_Node(val)),y);
break;
case 2: Split(root[ver],val,x,z),Split(x,val-1,x,y);
if(sz[y]) y=Merge(son[y][0],son[y][1]), root[i]=Merge(Merge(x,y),z);
else root[i]=root[ver];
break;
case 3: root[i]=root[ver],Split(root[ver],val-1,x,y),printf("%d\n",sz[x]+1);//,root[i]=Merge(x,y);
break;
case 4: root[i]=root[ver],printf("%d\n",Kth(val,root[ver]));
break;
case 5: root[i]=root[ver],Split(root[ver],val-1,x,y),printf("%d\n",Find(x,1));//,root[i]=Merge(x,y);
break;
case 6: root[i]=root[ver],Split(root[ver],val,x,y),printf("%d\n",Find(y,0));//,root[i]=Merge(x,y);
break;
}
}
return 0;
}

洛谷.3835.[模板]可持久化平衡树(fhq treap)的更多相关文章

  1. Luogu P3835 【模板】可持久化平衡树(fhq Treap)

    P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...

  2. P3391 【模板】文艺平衡树FHQ treap

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  3. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  4. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

  5. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  6. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  9. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

随机推荐

  1. AngularJS总结

    因为最近想学习一下ionic框架,了解到ionic是基于AngularJS语法,并且通过SASS构建应用程序,之前自己一直用Vue框架,还有Less,刚刚好趁此机会,学习一下AngularJS与SAS ...

  2. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  3. Solr记录-solr基础内容

    Solr架构(体系结构) 在本章中,我们将讨论Apache Solr的架构. 下图显示了Apache Solr的体系结构的框图. Solr架构 - 构件块以下是Apache Solr的主要构建块(组件 ...

  4. 内网服务器通过Squid代理访问外网

    环境说明 项目整体需部署Zabbix监控并配置微信报警,而Zabbix Server并不能访问外网,故运维小哥找了台能访问外网的服务器做Suqid代理,Zabbix Server服务器通过代理服务器访 ...

  5. 流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系

    源码地址:https://github.com/Tinywan/PHP_Experience 很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参 ...

  6. 作业:JavaScript(数组篇-poker)给我的徒弟出个题。。。记得早点写完,然后大家3人可以早点打牌了

    吐槽一下:“今天实际上我左思右想,写个什么东西好呢!手上的笔转了半天....最后还是给自己留点余地!看着他们什么酒店管理系统,呼叫中心系统之类的....简直是把自己固定死了!感觉一撸到底的感觉!!!我 ...

  7. [转载]使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)

    http://www.cnblogs.com/benbenkoala/archive/2009/03/11/1407793.html 引言:SQL Server的事务日志传送备份是仅次于镜像的高可靠性 ...

  8. UVALive 7456 Least Crucial Node

    题目链接 题意: 给定一个无向图,一个汇集点,问哪一个点是最关键的,如果有多个关键点,输出序号最小的那个. 因为数据量比较小,所以暴力搜索就行,每去掉一个点,寻找和汇集点相连的还剩几个点,以此确定哪个 ...

  9. Struts2不扫描jar包中的action

    今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...

  10. Linux 黑白界面显示

    2014年1月14日 15:47:47 不知道别人怎么看,反正我觉得黑白配显示很方便阅读 命令: ls 脚本: ~/.bashrc 指令: alias ls='ls --color=never' 命令 ...