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

题目链接:luogu P5055

题目大意

要你维护插入,删除,区间翻转,区间求和。
但要求可持续化,即每次操作在一个历史版本上进行,且会产生一个新的历史版本

思路

看到题目都是可持续化平衡树了。

直接上 splay,这题要多搞一个 down。
down 交换左右儿子之前要复制左右儿子。

然后其他的就跟 可持久化平衡树 是差不多的了。

代码

#include<queue>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long longusing namespace std;int n, rt[200001], bb, op, x, y, tot;
int ls[200001 << 7], rs[200001 << 7], yj[200001 << 7], sz[200001 << 7];
bool turn[200001 << 7];
ll sum[200001 << 7], lastans, val[200001 << 7];int newpoint(ll num) {int re = ++tot;ls[re] = rs[re] = turn[re] = 0;val[re] = num;sum[re] = num;yj[re] = rand();sz[re] = 1;return re;
}int copypoint(int pl) {int re = ++tot;ls[re] = ls[pl];rs[re] = rs[pl];val[re] = val[pl];sum[re] = sum[pl];yj[re] = yj[pl];turn[re] = turn[pl];sz[re] = sz[pl];return re;
}void up(int now) {sz[now] = sz[ls[now]] + sz[rs[now]] + 1;sum[now] = sum[ls[now]] + sum[rs[now]] + val[now];
}void down(int now) {if (turn[now]) {if (ls[now]) ls[now] = copypoint(ls[now]);//记得翻转前左右儿子要复制if (rs[now]) rs[now] = copypoint(rs[now]);swap(ls[now], rs[now]);if (ls[now]) turn[ls[now]] ^= 1;if (rs[now]) turn[rs[now]] ^= 1;turn[now] ^= 1;}
} pair <int, int> split_rnk(int now, int rnk) {if (!now) return make_pair(0, 0);if (!rnk) return make_pair(0, copypoint(now));down(now);pair <int, int> re;if (rnk <= sz[ls[now]]) {int noww = copypoint(now);re = split_rnk(ls[noww], rnk);ls[noww] = re.second;up(noww);re.second = noww;}else {int noww = copypoint(now);re = split_rnk(rs[noww], rnk - sz[ls[now]] - 1);rs[noww] = re.first;up(noww);re.first = noww;}return re;
}int merge(int x, int y) {if (x) down(x);if (y) down(y);if (!x) return y;if (!y) return x;if (yj[x] < yj[y]) {int xx = copypoint(x);rs[xx] = merge(rs[xx], y);up(xx);return xx;}else {int yy = copypoint(y);ls[yy] = merge(x, ls[yy]);up(yy);return yy;}
}void insert(int bb, int pl, int num) {pair <int, int> x = split_rnk(rt[bb], pl);int y = newpoint(num);rt[bb] = merge(x.first, merge(y, x.second));
}void delete_(int bb, int pl) {pair <int, int> x = split_rnk(rt[bb], pl - 1);pair <int, int> y = split_rnk(x.second, 1);rt[bb] = merge(x.first, y.second);
}void turn_(int bb, int l, int r) {pair <int, int> x = split_rnk(rt[bb], l - 1);pair <int, int> y = split_rnk(x.second, r - l + 1);turn[y.first] ^= 1;rt[bb] = merge(merge(x.first, y.first), y.second);
}ll get_sum(int bb, int l, int r) {pair <int, int> x = split_rnk(rt[bb], l - 1);pair <int, int> y = split_rnk(x.second, r - l + 1);return sum[y.first];
}int main() {srand(19491001);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %d", &bb, &op);rt[i] = rt[bb];if (op == 1) {scanf("%d %d", &x, &y);x ^= lastans; y ^= lastans;insert(i, x, y); continue;}if (op == 2) {scanf("%d", &x);x ^= lastans;delete_(i, x);continue;}if (op == 3) {scanf("%d %d", &x, &y);x ^= lastans;y ^= lastans;turn_(i, x, y);continue;}if (op == 4) {scanf("%d %d", &x, &y);x ^= lastans;y ^= lastans;lastans = get_sum(i, x, y);printf("%lld\n", lastans);}}return 0;
}

【luogu P5055】【模板】可持久化文艺平衡树相关推荐

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

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

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

    P5055 [模板]可持久化文艺平衡树 突然发现fhq_treap也是可以支持区间翻转的,所以基本上和其他平衡树是一样的,而且还满足重量平衡树的性质,真是太优秀了,只不过常数稍微比较大. 然后这里我们 ...

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

    luoguP5055 [模板]可持久化文艺平衡树 可持久化非旋转treap 好题. Code: #include<bits/stdc++.h> using namespace std; # ...

  4. 【LG5055】可持久化文艺平衡树

    [LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...

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

    题面 https://www.luogu.org/problem/P5055 题解 #include<cstdio> #include<iostream> #include&l ...

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

    DescriptionDescriptionDescription 写一种数据结构,要求支持插入,删除,查询区间和,区间翻转且可持久化 SolutionSolutionSolution 无旋Treap ...

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

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

  8. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  9. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

最新文章

  1. J-link v8固件修复
  2. 【SmartJob】配置说明
  3. 《Java从入门到放弃》框架入门篇:hibernate基本配置
  4. 服务器异常下电文件系统,SUN服务器Solaris异常情况下恢复操作步骤(8页)-原创力文档...
  5. 开源 -- 机器学习相关报道
  6. 【转】 测试人员的职业规划 --整理标注
  7. android 字体像素转换工具类_Android点9图机制及在聊天气泡中的应用
  8. android俄罗斯方块开发代码,基于Android的俄罗斯方块开发(附源码)
  9. 群体智能优化算法之粒子群优化算法
  10. 1302数码管c语言程序,基于AVR单片机的DS1302数码管时间显示C语言程序设计
  11. 工资计算器的小demo
  12. 夏普SHARP MX-3508N 一体机驱动
  13. 连续分配、链接分配和索引分配详解
  14. NetSuite 财务科目合并
  15. 欢迎页面welcome.jsp
  16. android tf卡及u盘_一体化储存芯片(U 盘、SD卡、TF卡) NAND定义开发-U盘篇
  17. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
  18. SQL语句--简单的函数书写举例(3)
  19. 暴走欧洲之文明的迭代
  20. java 取消引用_java编译时所说的“无法取消引用”是什么意思

热门文章

  1. 每一个被别人吃得死死的人,其实是…
  2. 王者荣耀高清壁纸脚本Python文件
  3. C语言六位数字钟程序,单片机制作的6位数字钟
  4. python 三种实现按照固定比例分配任务的方法
  5. JAVA基础经典50题
  6. css实现内凹圆角,利用圆角反向进行(转)
  7. HDFS 的深入了解,深入浅出,面试必备(Hadoop的三部曲——上)
  8. 关于几何学发展的三阶段
  9. 【QT】QObject简介
  10. 人工蜂群算法python_python如何实现人工蜂群算法 python实现人工蜂群算法代码示例...