题目链接

对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样)。时间空间复杂度都为O(qlogq)。(应该更大些 因为rand()?内存真的爆炸。。)

对于无修改的操作实际上是可以直接赋值的,因为以后也不会去改当前树,只需要查询;修改时自会复制新节点。

虽然操作3.4.5.6不会改变原树,但是Split()会改变树的形态,所以仍要新建节点,但根节点不需要Merge()。

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <algorithm>
  4. #define gc() getchar()
  5. const int N=5e5+5,S=N*45,INF=0x7fffffff;
  6. int root[N];
  7. namespace fhq_Treap
  8. {
  9. #define lson son[rt][0]
  10. #define rson son[rt][1]
  11. int tot,fix[S],val[S],son[S][2],sz[S];//必须要*50啊QAQ
  12. inline int New_Node(int v){
  13. val[++tot]=v, fix[tot]=rand(), sz[tot]=1/*sz[]无所谓*/;
  14. return tot;
  15. }
  16. inline void Update(int rt){
  17. sz[rt]=sz[lson]+sz[rson]+1;
  18. }
  19. int Merge(int x,int y)
  20. {//复制出一棵合并后的树并返回
  21. if(!x||!y) return x^y;
  22. if(fix[x]<fix[y])
  23. {
  24. int p=New_Node(val[x]);//复制x的左儿子,更新右儿子
  25. son[p][0]=son[x][0], son[p][1]=Merge(son[x][1],y), Update(p);
  26. return p;
  27. }
  28. else{
  29. int p=New_Node(val[y]);
  30. son[p][1]=son[y][1], son[p][0]=Merge(x,son[y][0]), Update(p);
  31. return p;
  32. }
  33. }
  34. void Split(int rt,int v,int &x,int &y)
  35. {//复制出两棵树来给x,y
  36. if(!rt) x=y=0;
  37. else if(val[rt]<=v){
  38. x=New_Node(val[rt]), son[x][0]=lson, Split(rson,v,son[x][1],y);
  39. Update(x);
  40. }
  41. else{
  42. y=New_Node(val[rt]), son[y][1]=rson, Split(lson,v,x,son[y][0]);
  43. Update(y);
  44. }
  45. }
  46. int Kth(int k,int rt)
  47. {
  48. while(1)
  49. {
  50. if(sz[lson]+1==k) return val[rt];
  51. if(sz[lson]<k) k-=sz[lson]+1, rt=rson;
  52. else rt=lson;
  53. }
  54. }
  55. int Find(int x,int w)
  56. {
  57. if(!x) return w?INF:-INF;
  58. while(son[x][w]) x=son[x][w];
  59. return val[x];
  60. }
  61. }
  62. using namespace fhq_Treap;
  63. inline int read()
  64. {
  65. int now=0,f=1;register char c=gc();
  66. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  67. for(;isdigit(c);now=now*10+c-'0',c=gc());
  68. return now*f;
  69. }
  70. int main()
  71. {
  72. int q=read();
  73. for(int ver,opt,val,x,y,z,i=1; i<=q; ++i)
  74. {
  75. switch(ver=read(),opt=read(),val=read(),opt)
  76. {
  77. case 1: Split(root[ver],val,x,y),root[i]=Merge(Merge(x,New_Node(val)),y);
  78. break;
  79. case 2: Split(root[ver],val,x,z),Split(x,val-1,x,y);
  80. if(sz[y]) y=Merge(son[y][0],son[y][1]), root[i]=Merge(Merge(x,y),z);
  81. else root[i]=root[ver];
  82. break;
  83. case 3: root[i]=root[ver],Split(root[ver],val-1,x,y),printf("%d\n",sz[x]+1);//,root[i]=Merge(x,y);
  84. break;
  85. case 4: root[i]=root[ver],printf("%d\n",Kth(val,root[ver]));
  86. break;
  87. case 5: root[i]=root[ver],Split(root[ver],val-1,x,y),printf("%d\n",Find(x,1));//,root[i]=Merge(x,y);
  88. break;
  89. case 6: root[i]=root[ver],Split(root[ver],val,x,y),printf("%d\n",Find(y,0));//,root[i]=Merge(x,y);
  90. break;
  91. }
  92. }
  93. return 0;
  94. }

洛谷.3835.[模板]可持久化平衡树(fhq treap)的更多相关文章

  1. Luogu P3835 【模板】可持久化平衡树(fhq Treap)

    P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...

  2. P3391 【模板】文艺平衡树FHQ treap

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  3. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  4. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

  5. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  6. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  9. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

随机推荐

  1. sql查询结果存入DataTable,然后从DataTable取数据

    public static DataTable SqlConnectionInformation() { string connstr = ConfigurationManager.Connectio ...

  2. vue 获取后端数据打印结果undefined问题

    今天做项目时后端有一个要展示到页面上的附件需要前端获取,我获取到了那个附件的信息,但打印fj.name或fj.url时控制台就会显示undefined,后来才发现是json数据没有解析对,应该使用JS ...

  3. Codeforces 923 B. Producing Snow

    http://codeforces.com/contest/923/problem/B 题意: 有n天,每天产生一堆体积为Vi的雪,每天所有雪堆体积减少Ti 当某一堆剩余体积vi<=Ti时,体积 ...

  4. Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现

    前言 本文起笔于2018-06-26周二,接了一个这周要完成的开发任务,需要先等其他人的接口,可能更新的会慢一些,还望大家见谅.这篇博客我们主要讲Spring Cloud Zuul.项目地址:我的gi ...

  5. J2EE完全手册(一)

    为了使开发者能尽快的开发企业级的应用程序,Sun在1999年推出一种基于J2SE(用于开发桌面应的Java标准版)的开发模型:J2EE,用于开发服务器应用程序与服务的Java企业版,他运行于J2EE服 ...

  6. unbind()清除指定元素绑定效果

    定义和用法 unbind() 方法移除被选元素的事件处理程序. 该方法能够移除所有的或被选的事件处理程序,或者当事件发生时终止指定函数的运行. ubind() 适用于任何通过 jQuery 附加的事件 ...

  7. ZYNQ. GPIO

    GPIO General Purpose I/O ,网上能找到很多关于znyq gpio 的文章. 分类:EMIO .MIO .AXI_GPIO 硬件系统 MIO和EMIO是在zynq核中配置的,MI ...

  8. 【API】网络编程模型、多线程

    1.网络通信编程 1)网络通信模型基础知识 TCP Server: WSAStartup() socket() bind() linsten() accept() send/recv() closes ...

  9. 网络抓包神器-Charles使用指南

    http://blog.csdn.net/liulanghk/article/details/46342205 目录 概述 安装 显示模式 PC端抓包 移动应用抓包 其他技能 charles使用问题汇 ...

  10. android蓝牙耳机下的语音(输入/识别)及按键监听

    背景:本人负责公司android平台的app开发,最近要开发一个语音助手类的app,类似于灵犀语音助手.虫洞语音助手等.其中有两个蓝牙耳机下的语音识别问题,比较折腾人,问题描述:1.蓝牙耳机连接下捕获 ...