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

题面

洛谷

题解

终于不可以用\(Trie\)水了。。。

和普通的\(FHQ\;treap\)差不多

注意一下\(pushdown\)、\(split\)要新开节点

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <ctime>
  8. using namespace std;
  9. inline int gi() {
  10. register int data = 0, w = 1;
  11. register char ch = 0;
  12. while (!isdigit(ch) && ch != '-') ch = getchar();
  13. if (ch == '-') w = -1, ch = getchar();
  14. while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
  15. return w * data;
  16. }
  17. const int MAX_N = 2e5 + 5;
  18. struct Node {
  19. int ls, rs, pri, val, size;
  20. long long sum;
  21. bool rev;
  22. } t[MAX_N << 6];
  23. int rub[MAX_N << 6], cur, rubtop, rt[MAX_N];
  24. inline int newNode(int v = 0) {
  25. int o = rubtop ? rub[rubtop--] : ++cur;
  26. t[o].val = t[o].sum = v; t[o].pri = rand(); t[o].size = 1;
  27. t[o].ls = t[o].rs = t[o].rev = 0;
  28. return o;
  29. }
  30. inline int clone(int y) {
  31. int x = rubtop ? rub[rubtop--] : ++cur;
  32. t[x] = t[y];
  33. return x;
  34. }
  35. inline void pushup(int o) {
  36. t[o].size = t[t[o].ls].size + t[t[o].rs].size + 1;
  37. t[o].sum = t[t[o].ls].sum + t[t[o].rs].sum + t[o].val;
  38. }
  39. inline void pushdown(int o) {
  40. if (!t[o].rev) return ;
  41. swap(t[o].ls, t[o].rs);
  42. if (t[o].ls) t[o].ls = clone(t[o].ls), t[t[o].ls].rev ^= 1;
  43. if (t[o].rs) t[o].rs = clone(t[o].rs), t[t[o].rs].rev ^= 1;
  44. t[o].rev = 0;
  45. }
  46. void split(int o, int k, int &ls, int &rs) {
  47. if (!o) ls = rs = 0;
  48. else {
  49. pushdown(o);
  50. if (k <= t[t[o].ls].size) rs = clone(o), split(t[rs].ls, k, ls, t[rs].ls), pushup(rs);
  51. else ls = clone(o), split(t[ls].rs, k - t[t[o].ls].size - 1, t[ls].rs, rs), pushup(ls);
  52. }
  53. }
  54. int merge(int x, int y) {
  55. if (!(x && y)) return x ^ y;
  56. if (t[x].pri < t[y].pri) {
  57. pushdown(y);
  58. t[y].ls = merge(x, t[y].ls);
  59. pushup(y);
  60. return y;
  61. } else {
  62. pushdown(x);
  63. t[x].rs = merge(t[x].rs, y);
  64. pushup(x);
  65. return x;
  66. }
  67. }
  68. void insert(int &o, int k, int v) {
  69. int x, y;
  70. split(o, k, x, y);
  71. o = merge(merge(x, newNode(v)), y);
  72. }
  73. void erase(int &o, int pos) {
  74. int x, y, z;
  75. split(o, pos, x, z);
  76. split(x, pos - 1, x, y);
  77. rub[++rubtop] = y;
  78. o = merge(x, z);
  79. }
  80. void reverse(int &o, int l, int r) {
  81. int x, y, z;
  82. split(o, r, x, z);
  83. split(x, l - 1, x, y);
  84. t[y].rev ^= 1;
  85. o = merge(merge(x, y), z);
  86. }
  87. long long query(int &o, int l, int r) {
  88. int x, y, z;
  89. split(o, r, x, z);
  90. split(x, l - 1, x, y);
  91. long long res = t[y].sum;
  92. o = merge(merge(x, y), z);
  93. return res;
  94. }
  95. long long ans = 0;
  96. int N;
  97. int main () {
  98. srand(19260817);
  99. N = gi();
  100. for (int i = 1; i <= N; i++) {
  101. int v = gi(), op = gi();
  102. rt[i] = rt[v];
  103. if (op == 1) { int k = gi() ^ ans, val = gi() ^ ans; insert(rt[i], k, val); }
  104. else if (op == 2) { int k = gi() ^ ans; erase(rt[i], k); }
  105. else if (op == 3) { int l = gi() ^ ans, r = gi() ^ ans; reverse(rt[i], l, r); }
  106. else { int l = gi() ^ ans, r = gi() ^ ans; printf("%lld\n", ans = query(rt[i], l, r)); }
  107. }
  108. return 0;
  109. }

【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. PhoneGap 介绍

    一.PhoneGap 是什么 1.PhoneGap 是一个用基于 HTML,CSS 和 JavaScript 的,创建移动跨平台移动应用程序的快速开发框架. 2.它使开发者能够利用 iPhone,An ...

  2. ZOJ-3279 Ants 树状数组 + 二分

    题目链接: https://cn.vjudge.net/problem/ZOJ-3279 题目大意: 有1到n 那个level 每一个level有a[i]只蚂蚁两种操作 p a b 把第a个level ...

  3. C语言文件操作总结

    文件的打开操作 fopen 打开一个文件,操作文件指针FILE * 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 fg ...

  4. Sublime Text 3中文乱码问题解决

    Sublime Text 3是我MacBook Pro最喜欢的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开GBK的代码文件,如果里面有中文 ...

  5. Go 测试单个方法

    1.目录 gotest.go package mytest import ( "errors" ) func Division(a, b float64) (float64, er ...

  6. 【转】:Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级

    为方便截图,本文操作都在vmware虚拟机上完成. 目录: 1.操作系统安装 2.数据库安装 3.PSU补丁升级卸载   part1 操作系统安装 Oracle (Enterprise) Linux ...

  7. Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”

    解决办法:登录Apple开发证书后台,把发布版证书.cer文件下载到本地,双击安装即可.若还没有设置发布证书文件,则创建一个后下载. Ref: https://blog.csdn.net/dingqk ...

  8. 不可变字符串String与可变字符串StringBuilder、StringBuffer使用详解

    String字符串 char类型只能表示一个字符,而String可以表示字符串,也就是一个字符序列.但String不是基本类型,而是一个定义好的类,是一个引用类型.在Java中,可以将字符串直接量赋给 ...

  9. MySQL学习【第五篇SQL语句上】

    一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql ...

  10. Python中级 —— 03进程与线程

    多任务的实现有3种方式: 多进程模式: 多线程模式: 多进程+多线程模式. ** 进程: ** 不同任务,例如打开一个写字本,就是开启一个新进程. 多进程 Unix/Linux操作系统提供了一个for ...