Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)
注意下传标记时也需要新建节点。空间开的尽量大。
#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)的更多相关文章
- P3391 【模板】文艺平衡树FHQ treap
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- 【LG5055】可持久化文艺平衡树
[LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- 洛谷P5055 可持久化文艺平衡树 (可持久化treap)
题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...
- 【模板】可持久化文艺平衡树-可持久化treap
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
随机推荐
- Saltstack学习之二:target与模块方法的运行
对象的管理 saltstack系统中我们的管理对象叫做target,在master上我们可以采用不同的target去管理不同的minion,这些target都是通过去管理和匹配minion的id来做的 ...
- NB-IoT协议及其PSM
物联网技术发展趋势是LPWAN,其中尤其以NB-IoT和eMTC最为代表.NB-IoT和eMTC各有优劣,使用场景互有不同. 低功耗可以说是物联网技术的核心,本着关注低功耗的方向,适当了解NB IoT ...
- odoo 装饰器用法@api
摘自:blog.csdn.net/cmzhuang/article/details/52932883 @api.one one装饰符自动遍历记录集,把self重新定义成当前记录.注意,返回值是一个li ...
- 在centos 7上安装BIMServer
下载bimserverwar-1.5.85.war https://github.com/opensourceBIM/BIMserver/releases mkdir -p /opt/bim cd / ...
- JS 去除重复元素的方法
Array.prototype.del = function () { var a = {}, c = [], l = this.length; ; i < l; i++) { var b = ...
- C#大型电商项目优化(三)——扩展性与支付
上一篇文章引来不少非议,笔者并非对EF有看法,而是针对不同的业务场景和框架背景,挑选不同的方案.每个方案都有其优势劣势,挑选最快速,最简单的方案,是笔者的初衷. 看评论也是学习的过程,然而有些只做评价 ...
- 免费的 Vue.js 入门与进阶视频教程
这是我免费发布的高质量超清「Vue.js 入门与进阶视频教程」. 全网最好的.免费的 Vue.js 视频教程,课程基于 Vue.js 2.0,由浅入深,最后结合实际的项目进行了最棒的技术点讲解,此课程 ...
- 阿里云Https通配符证书购买
先付款,再绑定证书. 会款后会审核,等待... DNS解析配置错误 按域名授权配置,增加一条 DNS Txt记录值.
- 一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)
在sql server中,update可以根据一个表的信息去更新另一个表的信息. 首先看一下语法: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHE ...
- sixsix团队“餐站”应用代码规范及开发文档
网络爬虫文档 以下是我们软工小组关于网络爬虫部分代码的的说明文档.至于一些分功能的小函数或方法就不在此赘述,一看就能明白.下面就主要的函数进行说明. 从总体上来说主要有三部分:店家信息爬取部分,菜品信 ...