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()?内存真的爆炸..) 对于无修改的操作实际上 ...
随机推荐
- Android学习之基础知识九—数据存储(持久化技术)
数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储.SharedP ...
- 利用 ProtoThreads实现Arduino多线程处理(1)
转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 这几天和群里小V同学讨论一个项目时,偶然发现了 ProtoThreads,简称PT,用其来实 ...
- docker命名空间、控制组及联合文件系统概念
基本架构 命名空间 控制组 联合文件系统 docker底层依赖的核心技术主要包括操作系统的命名空间(Namespace).控制组(Control Groups).联合文件系统(Union File S ...
- 创建http.Server实例,端口占用就换个端口
/** * Created by Sorrow.X on 2017/10/25. */ const http = require('http'); const url = require('url') ...
- element vuex 语音播报
data () { return { showDetail: false, height: 1, // 1 不可用 0 正常 2运维中 result: [], tableData: [], // 应用 ...
- Kubernetes-v1.12.0基于kubeadm部署
1.主机规划 #master节点(etcd/apiserver/scheduler/controller manager)master.example.cometh0: 192.168.0.135et ...
- 微软下一代Web前端技术Blazor(C#编译为WebAssembly)
W3C Web标准化机构在制定下一代的网页技术WebAssembly.目前版本是1.0,主流浏览器的最新版本都已经支持.其特点是浏览器可以执行编译后的二进制程序,不需要像之前的程序,浏览器下载Java ...
- 【转】单KEY业务,数据库水平切分架构实践
本文将以“用户中心”为例,介绍“单KEY”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践: 如何来实施水平切分 水平切分后常见的问题 典型问题的优化思路及实践 一.用户 ...
- C# LINQ 详解 From Where Select Group Into OrderBy Let Join
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- Linux Shell完成Qt程序的自动部署
#!/bin/sh #取当前脚本的绝对路径 srcDir=$(cd ")";pwd) #设置库所在路径 libDir=${srcDir}"/J1900RunLib/*&q ...