好题.

Code:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define setIO(s) freopen(s".in","r",stdin)
  4. namespace fhqtreap{
  5. #define maxn 20000000
  6. #define ll long long
  7. int tot,m,tr;
  8. int trash[maxn];
  9. int ls[maxn],rs[maxn],rev[maxn],val[maxn],sz[maxn],key[maxn];
  10. int root[maxn];
  11. ll sumv[maxn];
  12. ll lastans;
  13. void ini(){
  14. tr=0;
  15. for(int i=1;i<1000000;++i) trash[++tr]=i;
  16. tot=1000001;
  17. }
  18. int newnode(){
  19. return tr?trash[tr--]:++tot;
  20. }
  21. int cpy(int p){
  22. int x=newnode();
  23. sz[x]=sz[p],ls[x]=ls[p],rs[x]=rs[p];
  24. rev[x]=rev[p],val[x]=val[p],key[x]=key[p],sumv[x]=sumv[p];
  25. return x;
  26. }
  27. void up(int x){
  28. sz[x]=sz[ls[x]]+sz[rs[x]]+1;
  29. sumv[x]=sumv[ls[x]]+sumv[rs[x]]+(long long)val[x];
  30. }
  31. int New(int v){
  32. int p=newnode();
  33. sz[p]=1,ls[p]=rs[p]=0,sumv[p]=val[p]=v,key[p]=rand(),rev[p]=0;
  34. return p;
  35. }
  36. void era(int x){
  37. sz[x]=ls[x]=rs[x]=rev[x]=val[x]=sumv[x]=key[x]=0;
  38. trash[++tr]=x;
  39. }
  40. void pd(int x){
  41. if(!x||!rev[x]) return;
  42. if(rev[x]){
  43. swap(ls[x],rs[x]);
  44. if(ls[x]) ls[x]=cpy(ls[x]),rev[ls[x]]^=1;
  45. if(rs[x]) rs[x]=cpy(rs[x]),rev[rs[x]]^=1;
  46. rev[x]=0;
  47. }
  48. }
  49. void split(int x,int k,int &l,int &r){
  50. if(x){
  51. pd(x);
  52. if(k<=sz[ls[x]]) {
  53. r=cpy(x);
  54. split(ls[r],k,l,ls[r]);
  55. up(r);
  56. }
  57. else {
  58. l=cpy(x);
  59. split(rs[l],k-sz[ls[l]]-1,rs[l],r);
  60. up(l);
  61. }
  62. }else l=r=0;
  63. }
  64. int mg(int l,int r){
  65. if(l&&r){
  66. if(key[l]<key[r]) {
  67. pd(r),ls[r]=mg(l,ls[r]),up(r);
  68. return r;
  69. }else {
  70. pd(l),rs[l]=mg(rs[l],r),up(l);
  71. return l;
  72. }
  73. }else return l+r;
  74. }
  75. void ins(int &rt,int p,int v){
  76. int x,y;
  77. split(rt,p,x,y);
  78. rt=mg(mg(x,New(v)),y);
  79. }
  80. void Del(int &rt,int p){
  81. int x,y,z;
  82. split(rt,p,x,y),split(x,p-1,x,z),era(z);
  83. rt=mg(x,y);
  84. }
  85. void Rev(int &rt,int L,int R){
  86. int x,y,z;
  87. split(rt,R,x,y),split(x,L-1,x,z),rev[z]^=1;
  88. rt=mg(mg(x,z),y);
  89. }
  90. void Q(int &rt,int L,int R){
  91. int x,y,z;
  92. split(rt,R,x,y),split(x,L-1,x,z), printf("%lld\n",(lastans=sumv[z]));
  93. rt=mg(mg(x,z),y);
  94. }
  95. int main(){
  96. ini();
  97. int n,a=0,b=0;
  98. scanf("%d",&n);
  99. for(int opt,v,i=1;i<=n;++i){
  100. scanf("%d%d",&v,&opt);
  101. root[i]=root[v];
  102. scanf("%d",&a),a^=lastans;
  103. if(opt!=2) scanf("%d",&b),b^=lastans;
  104. if(opt==1) ins(root[i],a,b);
  105. if(opt==2) Del(root[i],a);
  106. if(opt==3) Rev(root[i],a,b);
  107. if(opt==4) Q(root[i],a,b);
  108. }
  109. return 0;
  110. }
  111. };
  112. int main(){
  113. //setIO("input");
  114. fhqtreap::main();
  115. return 0;
  116. }

  

luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap的更多相关文章

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

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

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

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

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

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

  4. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

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

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

  6. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  7. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  8. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  9. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

随机推荐

  1. How many integers can you find HDU - 1796_容斥计数

    Code: #include<cstdio> using namespace std; typedef long long ll; const int R=13; ll a[R]; ll ...

  2. sklearn学习汇总

    该博主总结的很好,https://www.cnblogs.com/hellcat/p/7531789.html 1.kaggle给出的导图 2.转化成树图: 3.sklearn工具导图

  3. 00070_Calendar

    1.Calendar类概念 (1)Calendar是日历类,在Date后出现,替换掉了许多Date的方法.该类将所有可能用到的时间信息封装为静态成员变量,方便获取: (2)Calendar为抽象类,由 ...

  4. jedis 连接 redis

    一.连接单机版的 redis /** * 直接连接 redis * @throws Exception */ @Test public void test1() throws Exception { ...

  5. sql中自连接的使用

    一.用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题.下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系.SQL代码如下: ...

  6. Sereja and Bottles-水题有点坑爹

    CodeForces - 315A Sereja and Bottles Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format:  ...

  7. HBase读取代码

    HBase读取代码 需要的jar包: activation-1.1.jar aopalliance-1.0.jar apacheds-i18n-2.0.0-M15.jar apacheds-kerbe ...

  8. 为什么mysql中用\G表示按列方式显示

    关于mysql的错误 - no query specified 学习了:http://blog.csdn.net/tenfyguo/article/details/7566941 sql语句可以用分号 ...

  9. 升级后开机就提示“android.process.acore”停止执行 --分析 解决方式

    OTA升级的,升级引发的全部问题都是能够解释的,有的能解决,有的不能解决. 一个项目报了这个问题. 升级后开机就提示"android.process.acore"停止执行 抓取 a ...

  10. mysql基础综述(四)

    1.数据库的简单介绍 1.1 数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle  是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IBM公司 ...