【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】可持久化文艺平衡树的更多相关文章

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

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

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

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

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

    题意 您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本): 在第 pp 个数后插入数 xx . 删除第 pp 个数. 翻转区间 [l,r][l,r],例如原序列是 { ...

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

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

  5. Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)

    注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

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

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

  7. luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap

    好题. Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...

  8. SLT学习——leafes tree扩展 【文艺平衡树】

    这是一个全新的数据结构 md,别看这篇文章了,这篇已经废了. 百折不饶,再交一次,更新复杂度证明 这里是HYF,蒟蒻一只,最近因某些原因开始学数据结构了,然后就写了这篇题解. 下面给大家介绍一个全新的 ...

  9. 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树

    !前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...

随机推荐

  1. PostgreSQL 连接问题 FATAL: no pg_hba.conf entry for host

    The server doesn't grant access to the database: the server reports FATAL: no pg_hba.conf entry for ...

  2. 使用python 操作liunx的svn,方案二

    在对liunx操作svn的方式,做了改动,使用python的,subprocess进行操作 在第一种方案中,我使用了先拉到本地,然后再创建,在进行上传,实际在svn中可以直接创建文件,并进行文件复制, ...

  3. webpack环境搭建开发环境,JavaScript面向对象的详解,UML类图的使用

    PS:因为所有的设计模式都是基于面向对象来完成的,所以在讲解设计模式之前先来过一下面向对象都有哪些知识点 搭建开发环境 初始化npm环境 下载安装nodejs安装即可,nodejs自带npm管理包,然 ...

  4. HDU 4652 Dice

    嘟嘟嘟 题目大意就是对于一个m面的骰子,回答这么两个问题: 1.求连续扔n次都是同一数字的期望次数. 2.求连续扔n次每一次数字都不相同的期望次数. 对于期望dp特别菜的我来说,这道题已经算是很难了. ...

  5. istringstream和ostringstream的实现

    ostringstream是将数据写入string里边的,istringstream是将从string里边读出数据的: #include <sstream> int main() { st ...

  6. js apply的用法

    问题: 1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和ca ...

  7. jQuery Mobile中jQuery.mobile.changePage方法使用详解

    jQuery.mobile.changePage方法用的还是很多的.作为一个老手,有必要对jQuery mobile中实用方法做一些总结.系列文章请看jQuery Mobile专栏.jquery.mo ...

  8. 洛谷P2336 [SCOI2012]喵星球上的点名(后缀数组+莫队)

    我学AC自动机的时候就看到了这题,想用AC自动机结果被学长码风劝退-- 学后缀数组时又看到了这题--那就写写后缀数组做法吧 结果码风貌似比当年劝退我的学长还毒瘤啊 对所有的模式串+询问串,不同串之间用 ...

  9. maven 编译替换占位符

    首先开启资源配置的插件,由此插件替换占位符 <plugin> <groupId>org.apache.maven.plugins</groupId> <art ...

  10. disconf实践(四)基于注解的分布式配置文件管理,自动reload

    上一篇讲解了基于xml的自动reload的分布式配置文件管理,这一篇讲解基于注解的自动reload的方式(基于disconf实践二). 1. 修改spring配置文件 <?xml version ...