fhq-treap,也即非旋treap,可以在不进行旋转操作的前提下维护treap。由于不需要旋转,可以对其可持久化。

  fhq-treap的基本操作是merge和split,并且通过这两个操作实现对treap的各项维护。

  merge用来合并两棵treap,且要求满足其中一棵treap中的最大值小于另一棵treap中的最小值。实现方式类似于左偏树,即每次考虑合并以x为根和以y为根的子树(不妨令x子树中的值较小)。因为要维持treap自身的性质,合并后应该以x和y中优先级较高的为根。如果x优先级较高,继续将x的右子树与y合并,再将所得子树作为x的右子树;如果y优先级较高,继续将y的左子树与x合并,再将所得子树作为y的左子树。这里就可以进行可持久化。因为树高是期望log的,合并复杂度即为log。

  split用来将一棵treap分裂为两棵,且分裂后使得前k小的作为一棵treap,剩下的作为另一棵。具体地,分裂以x为根的子树时,考虑前k小的所处位置。如果左子树大小恰好为k,分裂后直接退出;如果左子树大小>k,显然应该进入左子树继续操作,分裂后返回两棵treap的根,其中一棵接到已分裂好的原treap上。另一种情况类似。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 500010
#define inf 2147483647
#define pii pair<int,int>
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,root[N],cnt;
struct data{int ch[],x,p,s;
}tree[N<<];
void up(int k){tree[k].s=tree[lson].s+tree[rson].s+;}
int qnum(int k,int x)
{
if (tree[lson].s+==x) return tree[k].x;
if (tree[lson].s+>x) return qnum(lson,x);
else return qnum(rson,x-tree[lson].s-);
}
int qrank(int k,int x)
{
if (!k) return ;
if (tree[k].x>=x) return qrank(lson,x);
else return tree[lson].s++qrank(rson,x);
}
int qpre(int k,int x)
{
if (!k) return -inf;
if (tree[k].x>=x) return qpre(lson,x);
else return max(tree[k].x,qpre(rson,x));
}
int qsuf(int k,int x)
{
if (!k) return inf;
if (tree[k].x<=x) return qsuf(rson,x);
else return min(tree[k].x,qsuf(lson,x));
}
int merge(int x,int y)
{
if (!x||!y) return x|y;
int k=++cnt;
if (tree[x].p>tree[y].p)
{
tree[k]=tree[x];
rson=merge(rson,y);
}
else
{
tree[k]=tree[y];
lson=merge(x,lson);
}
up(k);
return k;
}
pii split(int k,int x)
{
if (!k) return make_pair(,);
int u=++cnt;tree[u]=tree[k];
if (tree[tree[u].ch[]].s==x) return tree[u].ch[]=,up(u),make_pair(lson,u);
if (tree[tree[u].ch[]].s>x)
{
pii v=split(tree[u].ch[],x);
return tree[u].ch[]=v.second,up(u),make_pair(v.first,u);
}
else
{
pii v=split(tree[u].ch[],x-tree[tree[u].ch[]].s-);
return tree[u].ch[]=v.first,up(u),make_pair(u,v.second);
}
}
int newpoint(int x)
{
cnt++;tree[cnt].x=x,tree[cnt].p=rand(),tree[cnt].s=,tree[cnt].ch[]=tree[cnt].ch[]=;
return cnt;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("fhqtreap.in","r",stdin);
freopen("fhqtreap.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
srand();
m=read();
for (int i=;i<=m;i++)
{
int last=read(),op=read(),x=read();
root[i]=root[last];
switch (op)
{
case :
{
int u=qrank(root[i],x),v=newpoint(x);
pii p=split(root[i],u);
root[i]=merge(merge(p.first,v),p.second);
break;
}
case :
{
int p=qrank(root[i],x);
if (qnum(root[i],p+)==x)
{
pii u=split(root[i],p),v=split(u.second,);
root[i]=merge(u.first,v.second);
}
break;
}
case :
{
printf("%d\n",qrank(root[i],x)+);
break;
}
case :
{
printf("%d\n",qnum(root[i],x));
break;
}
case :
{
printf("%d\n",qpre(root[i],x));
break;
}
case :
{
printf("%d\n",qsuf(root[i],x));
break;
}
}
//for (int j=1;j<=m;j++) cout<<root[j]<<' ';cout<<endl;
//for (int j=1;j<=cnt;j++) cout<<tree[j].x<<' '<<tree[j].s<<' '<<tree[j].ch[0]<<' '<<tree[j].ch[1]<<endl;cout<<endl;
}
return ;
}

Luogu3835 【模板】可持久化平衡树(fhq-treap)的更多相关文章

  1. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

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

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

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

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

  4. 2021.12.08 平衡树——FHQ Treap

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

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

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

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

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

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

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

  8. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  9. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  10. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

随机推荐

  1. LeetCode112:Path Sum

    正常写法 bool HasPathSum(TreeNode root, int sum) { bool ret=false; if(root==null)return false; if(root.l ...

  2. MongoDB的地理位置查询,以及和mysql的使用对比

    MongoDB的一个特色就是具有丰富的查询接口,比如地理位置查询. 在地理位置查询上,MongoDB有着比传统关系型数据库的优势,下面举个例子. 当前移动互联网应用,按用户离目标门店距离排序上的场景很 ...

  3. Identity(三)

    本文摘自木宛城主的 ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 - 木宛城主 - 博客园 由于ASP.NET Membership.ASP.NET Simple ...

  4. HTML5 读取上传文件(转载)

    另参考 http://www.jianshu.com/p/46e6e03a0d53 1 filelist对象与file对象: <input type="file" id=&q ...

  5. How to Enable TLS 1.2 on Windows Server 2008 R2 and IIS 7.5

    Nowadays there is an SSL vulnerability called POODLE discovered by Google team in SSLv3 protocol. So ...

  6. Linux下修改/设置环境变量JAVA_HOME

    export设置只对当前的bash登录session有效.这是存在内存里面的.你可以写入文件一般的文件.之后source它.或者放到/etc/profile 等等的位置里,不同的地方效果不同. 1. ...

  7. [Spark][Python]sortByKey 例子

    [Spark][Python]sortByKey 例子: [training@localhost ~]$ hdfs dfs -cat test02.txt00002 sku01000001 sku93 ...

  8. CRC---循环冗余校验

    typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned short uInt16; uint crc; // ...

  9. 线程池ThreadPoolExecutor整理

    项目用到线程池,但是其实很多人对原理并不熟悉 ,这里只是整理一下 ThreadPoolExecutor java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心 ...

  10. php5.6安装Zend Opcache扩展

    假设php5.6安装路径为/data2/php[root@nextcloud src]# pwd/usr/local/src[root@nextcloud src]# wget http://pecl ...