【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火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
随机推荐
- Java虚拟机11:内存分配原则
前言 JVM的自动内存管理要自动化的解决两个问题:对象分配内存以及回收分配给对象的内存.对象的内存分配一般是指在堆上分配,少数情况下也可能会直接分配在老年代上,对象主要分配在新生代的Eden 区上,如 ...
- gluoncv 导入方式
了解了sys.path和python 的import 的话,之前修改gluoncv 的方式就可以有了新的简单的方法: 如果你pip install gluoncv的,然后脚本又git clone了,发 ...
- ZooKeeper学习之路 (四)ZooKeeper开发环境eclipse配置
一.eclipse中配置zookeeper开发环境 1)将zookeeper eclipse plugin中的6个jar包放到eclipse安装目录下的plugins文件中,重启eclipse (2) ...
- wfst讲解
一.比较好的博客 1.0 官方网站 1.1 语音识别解码器(1)—自动机与半环 1.2 走进语音识别中的WFST 1.3Kaldi WFST 构图 学习 二.比较好的paper 三.开源项目 3.1 ...
- JDK(三)JDK1.8源码分析【排序】mergeSort
归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that st ...
- JDK(一)JDK集合框架
JDK中的集合框架分为两大类:Collection和Map.Collection以一组Object的形式保存元素,Map以Key-Value对的形式保存元素. 上图列出的类并不完整,只列举了平时比较常 ...
- [转]未能加载文件或程序集 CrystalDecisions.Web Version=10.2.3600解决方法
找到你开发的机器上VS安装目录中的SDK\v2.0\BootStrapper\Packages\CrystalReports\CRRedist2005_x86.msi和SDK\v2.0\BootStr ...
- 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)
次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1∗b1<a2∗b2是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...
- 在Swift中使用AutoLayout-VFL(AutoLayout-VFL笔记)
1.背景 iOS开发这几年, UI布局工具从frame到Masonry到SnapKit, sb和xib的AutoLayout也用过, 但是代码版本的AutoLayout倒是没用过, 最近一年, 频频发 ...
- 怎么在苹果Mac虚拟机上安装Win7
怎么在苹果Mac虚拟机上安装Win7 使用 Mac 系统的用户,因为一些软件或是应用的原因,可能需要 Windows 系统才能完成.那如果不想在自己的 Mac 电脑上安装双启动系统的话,我们还可以在 ...