注意下传标记时也需要新建节点。空间开的尽量大。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
#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 m,root[N],cnt;
ll lastans;
struct data{int ch[],size,x,p,rev;ll sum;
}tree[N*];
void up(int k)
{
tree[k].size=tree[lson].size+tree[rson].size+;
tree[k].sum=tree[lson].sum+tree[rson].sum+tree[k].x;
}
void rev(int &k){if (k) tree[++cnt]=tree[k],k=cnt,swap(lson,rson),tree[k].rev^=;}
void down(int k){if (tree[k].rev) rev(lson),rev(rson),tree[k].rev=;}
pii split(int k,int x)
{
if (!k) return make_pair(,);
int u=++cnt;tree[u]=tree[k];
down(u);int t=tree[u].ch[];
if (tree[tree[u].ch[]].size==x) return tree[u].ch[]=,up(u),make_pair(t,u);
if (tree[tree[u].ch[]].size>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[]].size-);
return tree[u].ch[]=v.first,up(u),make_pair(u,v.second);
}
}
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];down(k);
rson=merge(rson,y);
}
else
{
tree[k]=tree[y];down(k);
lson=merge(x,lson);
}
up(k);
return k;
}
int newpoint(int x)
{
int k=++cnt;tree[k].x=tree[k].sum=x,tree[k].size=,tree[k].rev=lson=rson=,tree[k].p=rand();
return k;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("splay.in","r",stdin);
freopen("splay.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();
root[i]=root[last];
switch (op)
{
case :
{
int p=read()^lastans,x=read()^lastans;
pii u=split(root[i],p);int v=newpoint(x);
root[i]=merge(merge(u.first,v),u.second);
break;
}
case :
{
int p=read()^lastans;
pii u=split(root[i],p-),v=split(u.second,);
root[i]=merge(u.first,v.second);
break;
}
case :
{
int l=read()^lastans,r=read()^lastans;
pii u=split(root[i],l-),v=split(u.second,r-l+);
rev(v.first);
root[i]=merge(merge(u.first,v.first),v.second);
break;
}
case :
{
int l=read()^lastans,r=read()^lastans;
pii u=split(root[i],l-),v=split(u.second,r-l+);
printf(LL,lastans=tree[v.first].sum);
root[i]=merge(merge(u.first,v.first),v.second);
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].size<<' '<<tree[j].sum<<' '<<tree[j].ch[0]<<' '<<tree[j].ch[1]<<' '<<tree[j].rev<<endl;
//cout<<endl;
}
return ;
}

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

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

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

  2. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap

    P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...

  3. 【LG5055】可持久化文艺平衡树

    [LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...

  4. 2021.12.08 平衡树——FHQ Treap

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

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

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

  6. 洛谷P5055 可持久化文艺平衡树 (可持久化treap)

    题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...

  7. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

    题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...

  8. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

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

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

随机推荐

  1. docker命名空间、控制组及联合文件系统概念

    基本架构 命名空间 控制组 联合文件系统 docker底层依赖的核心技术主要包括操作系统的命名空间(Namespace).控制组(Control Groups).联合文件系统(Union File S ...

  2. cc攻击和ddos攻击的区别和攻防 + 调SYN连接参数

    1.一个是WEB网络层拒绝服务攻击(DDoS),一个是WEB应用层拒绝服务攻击(CC),网络层就是利用肉鸡的流量去攻击目标网站的服务器,针对比较本源的东西去攻击,服务器瘫痪了,那么运行在服务器上的网站 ...

  3. 如何屏蔽SkylineGlobe提供的三维地图控件上的快捷键

    SkyllineGlobe提供的 <OBJECT ID=" TerraExplorer3DWindow" CLASSID="CLSID:3a4f9192-65a8- ...

  4. python3 installed 安装 pip3

    curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3

  5. python 的zip 函数小例子

    In [57]: name = ('Tome','Rick','Stephon') In [58]: age = (45,23,55) In [59]: for a,n in zip (name,ag ...

  6. 关于LCA

    LCA:最近公共祖先 指在有根树中,找出某两个结点u和v最近的公共祖先 如图,5,7的最近公共祖先就是3 接下来,我们来了解如何求解LCA No.1 暴力 首先想到的肯定是暴力,我们搜索,从两个节点一 ...

  7. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  8. nginx通过https方式反向代理多实例tomcat

    案例说明:前面一层nginx+Keepalived部署的LB,后端两台web服务器部署了多实例的tomcat,通过https方式部署nginx反向代理tomcat请求.配置一如下: 1)LB层的ngi ...

  9. python基础学习笔记(三)

    序列概览 Python 包含6 种内建的序列,这里重点讨论最常用的两种类型:列表和元组. 列表与元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可以会更好用:而 ...

  10. 作业20171123 beta-review 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月13日 17:00. 成绩 review NABCD-评论 SPEC-评论 bug found 答复 bugfi ...