其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下.

洛谷 P3369 【模板】普通平衡树

code:

  1. #include <bits/stdc++.h>
  2. #define N 100006
  3. #define lson t[x].ls
  4. #define rson t[x].rs
  5. #define setIO(s) freopen(s".in","r",stdin)
  6. using namespace std;
  7. int root;
  8. namespace treap
  9. {
  10. int tot;
  11. struct node
  12. {
  13. int val,size,ls,rs,ran;
  14. }t[N];
  15. inline void newnode(int &x,int val)
  16. {
  17. ++tot;
  18. t[tot].size=1;
  19. t[tot].val=val;
  20. t[tot].ran=rand();
  21. t[tot].ls=t[tot].rs=0;
  22. x=tot;
  23. }
  24. inline void pushup(int x)
  25. {
  26. t[x].size=t[lson].size+t[rson].size+1;
  27. }
  28. void split(int x,int &l,int &r,int val)
  29. {
  30. if(!x) { l=r=0; return; }
  31. if(t[x].val<=val) l=x, split(t[x].rs,t[l].rs,r,val);
  32. else r=x, split(t[x].ls,l,t[r].ls,val);
  33. pushup(x);
  34. }
  35. void merge(int &x,int a,int b)
  36. {
  37. if(!a||!b) { x=a+b; return; }
  38. if(t[a].ran<t[b].ran) x=a, merge(t[x].rs,t[a].rs,b);
  39. else x=b, merge(t[x].ls,a,t[b].ls);
  40. pushup(x);
  41. }
  42. void insert(int val)
  43. {
  44. int x=0,y=0,z=0;
  45. newnode(z,val);
  46. split(root,x,y,val-1);
  47. merge(x,x,z);
  48. merge(root,x,y);
  49. }
  50. void del(int val)
  51. {
  52. int x=0,y=0,z=0;
  53. split(root,x,y,val);
  54. split(x,x,z,val-1);
  55. merge(z,t[z].ls,t[z].rs);
  56. merge(x,x,z);
  57. merge(root,x,y);
  58. }
  59. void ask_rank(int v)
  60. {
  61. int x=0,y=0;
  62. split(root,x,y,v-1);
  63. printf("%d\n",t[x].size+1);
  64. merge(root,x,y);
  65. }
  66. void ask_num(int x,int kth)
  67. {
  68. while(t[lson].size+1!=kth)
  69. {
  70. if(t[lson].size>=kth) x=lson;
  71. else kth-=(t[lson].size+1),x=rson;
  72. }
  73. printf("%d\n",t[x].val);
  74. }
  75. void ask_front(int v)
  76. {
  77. int x=0,y=0;
  78. split(root,x,y,v-1);
  79. ask_num(x,t[x].size);
  80. merge(root,x,y);
  81. }
  82. void ask_back(int v)
  83. {
  84. int x=0,y=0;
  85. split(root,x,y,v),ask_num(y,1), merge(root,x,y);
  86. }
  87. };
  88. int main()
  89. {
  90. // setIO("input");
  91. int i,j,n;
  92. srand(16);
  93. scanf("%d",&n);
  94. for(i=1;i<=n;++i)
  95. {
  96. int opt,x;
  97. scanf("%d%d",&opt,&x);
  98. if(opt==1) treap::insert(x);
  99. if(opt==2) treap::del(x);
  100. if(opt==3) treap::ask_rank(x);
  101. if(opt==4) treap::ask_num(root,x);
  102. if(opt==5) treap::ask_front(x);
  103. if(opt==6) treap::ask_back(x);
  104. }
  105. return 0;
  106. }

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

code:

  1. #include <bits/stdc++.h>
  2. #define N 100006
  3. #define lson t[x].ls
  4. #define rson t[x].rs
  5. #define setIO(s) freopen(s".in","r",stdin)
  6. using namespace std;
  7. int tot,root;
  8. struct node
  9. {
  10. int ls,rs,val,size,ran,rev;
  11. }t[N];
  12. inline void newnode(int &x,int val)
  13. {
  14. x=++tot;
  15. t[x].ls=t[x].rs=0;
  16. t[x].val=val;
  17. t[x].size=1;
  18. t[x].ran=rand();
  19. t[x].rev=0;
  20. }
  21. inline void pushup(int x)
  22. {
  23. t[x].size=t[lson].size+t[rson].size+1;
  24. }
  25. void mark(int x)
  26. {
  27. swap(lson,rson), t[x].rev^=1;
  28. }
  29. inline void pushdown(int x)
  30. {
  31. if(t[x].rev)
  32. {
  33. if(lson) mark(lson);
  34. if(rson) mark(rson);
  35. t[x].rev=0;
  36. }
  37. }
  38. void split(int x,int &l,int &r,int kth)
  39. {
  40. if(!x) { l=r=0; return; }
  41. pushdown(x);
  42. if(t[lson].size+1<=kth) l=x,split(rson,t[l].rs,r,kth-t[lson].size-1);
  43. else r=x,split(lson,l,t[r].ls,kth);
  44. pushup(x);
  45. }
  46. void merge(int &x,int a,int b)
  47. {
  48. if(!a||!b) { x=a+b; return; }
  49. pushdown(a),pushdown(b);
  50. if(t[a].ran<t[b].ran) x=a, merge(rson,t[a].rs,b);
  51. else x=b, merge(lson,a,t[b].ls);
  52. pushup(x);
  53. }
  54. void build(int &x,int l,int r)
  55. {
  56. int mid=(l+r)>>1;
  57. newnode(x,mid);
  58. if(mid>l) build(lson,l,mid-1);
  59. if(r>mid) build(rson,mid+1,r);
  60. pushup(x);
  61. }
  62. void dfs(int x)
  63. {
  64. pushdown(x);
  65. if(lson) dfs(lson);
  66. printf("%d ",t[x].val);
  67. if(rson) dfs(rson);
  68. }
  69. int main()
  70. {
  71. // setIO("input");
  72. int i,j,n,m;
  73. scanf("%d%d",&n,&m);
  74. build(root,1,n);
  75. for(i=1;i<=m;++i)
  76. {
  77. int l,r;
  78. scanf("%d%d",&l,&r);
  79. int x=0,y=0,z=0;
  80. split(root,x,y,r);
  81. // x : 1->r y : r+1->n
  82. split(x,x,z,l-1);
  83. mark(z);
  84. root=0;
  85. merge(root,root,x);
  86. merge(root,root,z);
  87. merge(root,root,y);
  88. }
  89. dfs(root);
  90. return 0;
  91. }

  

非旋转 treap的更多相关文章

  1. [bzoj3173]最长上升子序列_非旋转Treap

    最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...

  2. 关于非旋转treap的学习

    非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...

  3. [Codeforces702F]T-Shirts——非旋转treap+贪心

    题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...

  4. BZOJ5063旅游——非旋转treap

    题目描述 小奇成功打开了大科学家的电脑. 大科学家打算前往n处景点旅游,他用一个序列来维护它们之间的顺序.初 始时,序列为1,2,...,n. 接着,大科学家进行m次操作来打乱顺序.每次操作有6步: ...

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

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

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

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

  7. [NOIP]2017列队——旋转treap/非旋转treap

    Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m.  为了便 ...

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

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

  9. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  10. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

随机推荐

  1. 工信部要求应用商店上新 App 检查 IPv6,这里有一份 IPv6 快速部署指南

    7 月 25 日,工业和信息化部信息通信发展司组织召开部署推进 IPv6 网络就绪专项行动电视电话会议.会议指出,加快推进 IPv6 规模部署,构建高速率.广普及.全覆盖.智能化的下一代互联网,是互联 ...

  2. Linux生产环境上,最常用的一套“Sed“技巧

    sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...

  3. win10 mars xlog编译

    win10 mars xlog编译   一. 环境准备 安装 cmake 以及 python2.7, 以及下载 ndk-r16b,并配置环境变量 NDK_ROOT 指向 ndk 路径. 如果是 Win ...

  4. vue-cli + webpack 环境搭建

    1.下载nodeJS,官网 https://nodejs.org/en/ . 2.安装nodeJS.安装完成后可以检测node -v 如果版本号的话则正常. 3.安装淘宝镜像.npm install ...

  5. weblogic unable to get file lock问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误: <2012-3- ...

  6. Resource interpreted as Document but transferred with MIME type application/json

    转自:https://blog.csdn.net/just_lover/article/details/81207472 我在修改并保存后,界面返回提示“undifine”,实际我是看到有返回提示的. ...

  7. Alpha_5

    一. 站立式会议照片 二. 工作进展 (1) 昨天已完成的工作 a. 我的·蜕变记录,我的·我的卡包,我的·习惯简记页面设计 b. 数据统计和数据详情页面设计 c. 实现自定义习惯图片和获取卡片功能页 ...

  8. 一行Python代码画心型

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yanlaifan/article/deta ...

  9. 第9章 运行TensorFlow

    目录 第9章 运行TensorFlow 创建一个计算图并在会话中执行 管理图 节点值的生命周期 TensorFlow中的线性回归 实现梯度下降 给训练算法提供数据 保存和恢复模型 用TensorBoa ...

  10. 腾讯微服务框架Tars的初体验

    最近研究了一下腾讯的微服务体系开发框架. 官方的搭建过程:https://github.com/TarsCloud/Tars/blob/master/Install.zh.md 自己填的坑: 不得不说 ...