【LG5055】可持久化文艺平衡树
【LG5055】可持久化文艺平衡树
题面
题解
终于不可以用\(Trie\)水了。。。
和普通的\(FHQ\;treap\)差不多
注意一下\(pushdown\)、\(split\)要新开节点
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <ctime>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 2e5 + 5;
struct Node {
int ls, rs, pri, val, size;
long long sum;
bool rev;
} t[MAX_N << 6];
int rub[MAX_N << 6], cur, rubtop, rt[MAX_N];
inline int newNode(int v = 0) {
int o = rubtop ? rub[rubtop--] : ++cur;
t[o].val = t[o].sum = v; t[o].pri = rand(); t[o].size = 1;
t[o].ls = t[o].rs = t[o].rev = 0;
return o;
}
inline int clone(int y) {
int x = rubtop ? rub[rubtop--] : ++cur;
t[x] = t[y];
return x;
}
inline void pushup(int o) {
t[o].size = t[t[o].ls].size + t[t[o].rs].size + 1;
t[o].sum = t[t[o].ls].sum + t[t[o].rs].sum + t[o].val;
}
inline void pushdown(int o) {
if (!t[o].rev) return ;
swap(t[o].ls, t[o].rs);
if (t[o].ls) t[o].ls = clone(t[o].ls), t[t[o].ls].rev ^= 1;
if (t[o].rs) t[o].rs = clone(t[o].rs), t[t[o].rs].rev ^= 1;
t[o].rev = 0;
}
void split(int o, int k, int &ls, int &rs) {
if (!o) ls = rs = 0;
else {
pushdown(o);
if (k <= t[t[o].ls].size) rs = clone(o), split(t[rs].ls, k, ls, t[rs].ls), pushup(rs);
else ls = clone(o), split(t[ls].rs, k - t[t[o].ls].size - 1, t[ls].rs, rs), pushup(ls);
}
}
int merge(int x, int y) {
if (!(x && y)) return x ^ y;
if (t[x].pri < t[y].pri) {
pushdown(y);
t[y].ls = merge(x, t[y].ls);
pushup(y);
return y;
} else {
pushdown(x);
t[x].rs = merge(t[x].rs, y);
pushup(x);
return x;
}
}
void insert(int &o, int k, int v) {
int x, y;
split(o, k, x, y);
o = merge(merge(x, newNode(v)), y);
}
void erase(int &o, int pos) {
int x, y, z;
split(o, pos, x, z);
split(x, pos - 1, x, y);
rub[++rubtop] = y;
o = merge(x, z);
}
void reverse(int &o, int l, int r) {
int x, y, z;
split(o, r, x, z);
split(x, l - 1, x, y);
t[y].rev ^= 1;
o = merge(merge(x, y), z);
}
long long query(int &o, int l, int r) {
int x, y, z;
split(o, r, x, z);
split(x, l - 1, x, y);
long long res = t[y].sum;
o = merge(merge(x, y), z);
return res;
}
long long ans = 0;
int N;
int main () {
srand(19260817);
N = gi();
for (int i = 1; i <= N; i++) {
int v = gi(), op = gi();
rt[i] = rt[v];
if (op == 1) { int k = gi() ^ ans, val = gi() ^ ans; insert(rt[i], k, val); }
else if (op == 2) { int k = gi() ^ ans; erase(rt[i], k); }
else if (op == 3) { int l = gi() ^ ans, r = gi() ^ ans; reverse(rt[i], l, r); }
else { int l = gi() ^ ans, r = gi() ^ ans; printf("%lld\n", ans = query(rt[i], l, r)); }
}
return 0;
}
【LG5055】可持久化文艺平衡树的更多相关文章
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- 洛谷P5055 可持久化文艺平衡树 (可持久化treap)
题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...
- LG5055 【模板】可持久化文艺平衡树
题意 您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本): 在第 pp 个数后插入数 xx . 删除第 pp 个数. 翻转区间 [l,r][l,r],例如原序列是 { ...
- 【模板】可持久化文艺平衡树-可持久化treap
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...
- Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)
注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...
- luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap
好题. Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...
- SLT学习——leafes tree扩展 【文艺平衡树】
这是一个全新的数据结构 md,别看这篇文章了,这篇已经废了. 百折不饶,再交一次,更新复杂度证明 这里是HYF,蒟蒻一只,最近因某些原因开始学数据结构了,然后就写了这篇题解. 下面给大家介绍一个全新的 ...
- 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
随机推荐
- iOS绘图事务的运行验证
结合WWDC,以我们的call stack为例,来说明这四个过程分别大概都做了什么. layout过程 从上面layout的过程可以看出,其所做的主要任务就是将图层调用代理(也就是视图)实现整个视图层 ...
- Hadoop学习之路(十八)MapReduce框架Combiner分区
对combiner的理解 combiner其实属于优化方案,由于带宽限制,应该尽量map和reduce之间的数据传输数量.它在Map端把同一个key的键值对合并在一起并计算,计算规则与reduce一致 ...
- 使用iframe标签隐藏CSRF代码
index.html <iframe src="1.html" width="0" height="0"></iframe ...
- Mac安装软件时提示已损坏的解决方法
问题描述 最近安装从网上下载的软件,安装完之后打开提示xxx已损坏,打不开,软件无法打开. 其实,这是新系统(macOS Sierra 10.12.X)新安全机制的锅,它默认不允许用户自行下载安装应用 ...
- 分享一下不错的样式,适用于Gridview,兼容性还不错!
使用方法很简单, 1.设置Gridview的[CssClass]属性为[tbinfo] 2.设置Gridview的[BorderWidth]属性为[0] 3.设置Gridview的[CellSpaci ...
- 指纹协查统计sql
select dic.name, NVL(zc.zc_djzs,0),NVL(zc.zc_shzs,0),NVL(zc.zc_bzzs,0), NVL(zt.zt_djzs,0),NVL(zt.zt ...
- Maven创建Web项目、、、整合SSM框架
自己接触ssm框架有一段时间了,从最早的接触新版ITOO项目的(SSM/H+Dobbu zk),再到自己近期来学习到的<淘淘商城>一个ssm框架的电商项目.用过,但是还真的没有自己搭建过, ...
- mysql 全量备份与增量备份
全量备份[root@master adm]# cat DBfullBak.sh #!/bin/bash #use mysqldump to fully backup mysql data BakDir ...
- C语言入门编程思维引导
编程思维引导: C语言中 include<stdio.h> 称之为导包,导入写好的函数库,多个则依次写 #define N 3 意思是将N这个字母定义为数字3 当使用的时候就直接用 i ...
- Java面向对象的三个特征
首先,Java面向对象的三大特征: 三大特征: ▪ 封装 ▪ 继承 ▪ 多态 首先面向对象的第一个特性 封装 : 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操 ...