Fhq-Treap.

  1. // Fhq-Treap
  2. const int MAXN = 1e5 + 5;
  3. struct Fhq_Treap {
  4. #define Lson Tr[p].l
  5. #define Rson Tr[p].r
  6. struct Fhq_Node {
  7. int l, r, Val, Key, Size;
  8. Fhq_Node () {}
  9. Fhq_Node (int L, int R, int V, int K, int S) {
  10. l = L, r = R, Val = V, Key = K, Size = S;
  11. }
  12. } Tr[MAXN];
  13. int Tot, Root;
  14. Fhq_Treap () { Tot = 0, Root = 0; }
  15. int Get(int Val) {
  16. Tr[++Tot] = Fhq_Node (0, 0, Val, rand(), 1);
  17. return Tot;
  18. }
  19. void Pull (int p) { Tr[p].Size = Tr[Lson].Size + Tr[Rson].Size + 1; }
  20. void Split (int p, int Val, int &x, int &y) {
  21. if (!p) {
  22. x = 0, y = 0;
  23. return;
  24. }
  25. if (Tr[p].Val <= Val)
  26. x = p, Split (Rson, Val, Rson, y);
  27. else
  28. y = p, Split (Lson, Val, x, Lson);
  29. Pull (p);
  30. }
  31. int Merge (int x, int y) {
  32. if (!x || !y)
  33. return x + y;
  34. if (Tr[x].Key <= Tr[y].Key) {
  35. Tr[x].r = Merge (Tr[x].r, y), Pull (x);
  36. return x;
  37. }
  38. else {
  39. Tr[y].l = Merge (x, Tr[y].l), Pull (y);
  40. return y;
  41. }
  42. }
  43. void Insert (int Val) {
  44. int x, y;
  45. Split (Root, Val, x, y), Root = Merge (Merge (x, Get(Val)), y);
  46. }
  47. void Delete (int Val) {
  48. int x, y, z;
  49. Split (Root, Val, x, z), Split (x, Val - 1, x, y);
  50. y = Merge (Tr[y].l, Tr[y].r), Root = Merge (Merge (x, y), z);
  51. }
  52. int Get_Rank (int Val) {
  53. int x, y, Ret;
  54. Split (Root, Val - 1, x, y);
  55. Ret = Tr[x].Size + 1, Root = Merge (x, y);
  56. return Ret;
  57. }
  58. int Get_Val (int Rank) {
  59. int p = Root;
  60. while (p) {
  61. if (Tr[Lson].Size + 1 == Rank)
  62. return Tr[p].Val;
  63. else if (Rank <= Tr[Lson].Size)
  64. p = Lson;
  65. else
  66. Rank -= (Tr[Lson].Size + 1), p = Rson;
  67. }
  68. return 0;
  69. }
  70. int Get_Pre (int Val) {
  71. int x, y, p;
  72. Split (Root, Val - 1, x, y), p = x;
  73. while (Rson)
  74. p = Rson;
  75. int ret = Tr[p].Val;
  76. Root = Merge (x, y);
  77. return ret;
  78. }
  79. int Get_Next (int Val) {
  80. int x, y, p;
  81. Split (Root, Val, x, y), p = y;
  82. while (Lson)
  83. p = Lson;
  84. int ret = Tr[p].Val;
  85. Root = Merge (x, y);
  86. return ret;
  87. }
  88. #undef Lson
  89. #undef Rson
  90. } Tree;

Splay.

  1. struct Splay_Tree {
  2. #define Lson Tr[p].Son[0]
  3. #define Rson Tr[p].Son[1]
  4. #define Inf 0x3f3f3f3f
  5. struct Splay_Node {
  6. int Son[2], Val, Cnt, Size, Fa;
  7. Splay_Node () {}
  8. Splay_Node (int V, int C, int S, int F) {
  9. Val = V, Cnt = C, Size = S, Fa = F;
  10. }
  11. } Tr[MAXN];
  12. int Tot, Root;
  13. bool Ident (int p) { return Tr[Tr[p].Fa].Son[1] == p; }
  14. int Get (int Val, int Fa) {
  15. Tr[++Tot].Fa = Fa, Tr[Tot].Cnt = Tr[Tot].Size = 1, Tr[Tot].Val = Val;
  16. return Tot;
  17. }
  18. void Pull (int p) { Tr[p].Size = Tr[Lson].Size + Tr[Rson].Size + Tr[p].Cnt; }
  19. void Build () {
  20. Root = Get (-Inf, 0);
  21. Tr[Root].Son[1] = Get (Inf, Root), Pull (Root);
  22. }
  23. void Connect (int p, int Fa, int flag) { Tr[Fa].Son[flag] = p, Tr[p].Fa = Fa; }
  24. void Rotate (int p) {
  25. int Fa = Tr[p].Fa, Grand = Tr[Fa].Fa;
  26. int Flag1 = Ident (p), Flag2 = Ident (Fa);
  27. Connect (p, Grand, Flag2), Connect (Tr[p].Son[Flag1 ^ 1], Fa, Flag1);
  28. Connect (Fa, p, Flag1 ^ 1), Pull (Fa), Pull (p);
  29. }
  30. void Splay (int p, int To) {
  31. for (int Fa = Tr[p].Fa; Tr[p].Fa != To; Rotate (p), Fa = Tr[p].Fa)
  32. if (Tr[Fa].Fa != To)
  33. Ident (p) == Ident (Fa) ? Rotate (Fa) : Rotate (p);
  34. if (!To)
  35. Root = p;
  36. }
  37. int Find (int p, int Val) {
  38. if (!p)
  39. return 0;
  40. if (Val == Tr[p].Val)
  41. return p;
  42. else if (Val < Tr[p].Val)
  43. return Find (Lson, Val);
  44. return Find (Rson, Val);
  45. }
  46. void Insert (int &p, int Val, int Fa) {
  47. if (!p)
  48. Splay (p = Get (Val, Fa), 0);
  49. else if (Val == Tr[p].Val)
  50. ++Tr[p].Cnt, Splay (p, 0);
  51. else if (Val < Tr[p].Val)
  52. Insert (Lson, Val, p);
  53. else
  54. Insert (Rson, Val, p);
  55. }
  56. void Delete(int Val) {
  57. int p = Find (Root, Val);
  58. if (!p)
  59. return;
  60. if (Tr[p].Cnt > 1) {
  61. --Tr[p].Cnt, Splay (p, 0), Pull (p);
  62. return;
  63. }
  64. Splay (p, 0);
  65. int l = Lson, r = Rson;
  66. while (Tr[l].Son[1])
  67. l = Tr[l].Son[1];
  68. while (Tr[r].Son[0])
  69. r = Tr[r].Son[0];
  70. Splay (l, 0), Splay (r, l);
  71. Tr[r].Son[0] = 0, Pull (r), Pull (l);
  72. }
  73. int Get_Rank (int p, int Val) {
  74. if (!p)
  75. return 0;
  76. if (Val == Tr[p].Val) {
  77. int Res = Tr[Lson].Size + 1; Splay(p, 0);
  78. return Res;
  79. }
  80. else if (Val < Tr[p].Val)
  81. return Get_Rank (Lson, Val);
  82. int Res = Tr[Lson].Size + Tr[p].Cnt;
  83. return Get_Rank (Rson, Val) + Res;
  84. }
  85. int Get_Val (int p, int rank) {
  86. if (!p)
  87. return Inf;
  88. if (Tr[Lson].Size >= rank)
  89. return Get_Val (Lson, rank);
  90. else if (Tr[Lson].Size + Tr[p].Cnt >= rank) {
  91. Splay (p, 0);
  92. return Tr[p].Val;
  93. }
  94. return Get_Val (Rson, rank - Tr[Lson].Size - Tr[p].Cnt);
  95. }
  96. int Get_Pre(int Val) {
  97. int p = Root, Ret;
  98. while (p) {
  99. if (Tr[p].Val < Val)
  100. Ret = Tr[p].Val, p = Rson;
  101. else
  102. p = Lson;
  103. }
  104. Splay (Root, 0);
  105. return Ret;
  106. }
  107. int Get_Next(int Val) {
  108. int p = Root, Ret;
  109. while (p) {
  110. if (Tr[p].Val > Val)
  111. Ret = Tr[p].Val, p = Lson;
  112. else
  113. p = Rson;
  114. }
  115. Splay (Root, 0);
  116. return Ret;
  117. }
  118. #undef Lson
  119. #undef Rson
  120. #undef Inf 0x3f3f3f3f
  121. } Tree;

Treap.

  1. // Treap
  2. const int MAXN = 1e5 + 5;
  3. struct Treap_Tree {
  4. #define INF 0x3f3f3f3f
  5. #define mod 998244353
  6. struct Treap_Node {
  7. int son[2], val, dat, cnt, size;
  8. #define lson tr[p].son[0]
  9. #define rson tr[p].son[1]
  10. Treap_Node() {}
  11. Treap_Node(int Val, int Dat, int Cnt, int Size) {
  12. val = Val;
  13. dat = Dat;
  14. cnt = Cnt;
  15. size = Size;
  16. }
  17. } tr[MAXN];
  18. int tot, root;
  19. int Get(int val) {
  20. tr[++tot] = Treap_Node(val, rand() % mod, 1, 1);
  21. tr[tot].son[0] = 0;
  22. tr[tot].son[1] = 0;
  23. return tot;
  24. }
  25. void Update(int p) { tr[p].size = tr[p].cnt + tr[lson].size + tr[rson].size; }
  26. int Get_Rank(int p, int val) {
  27. if (!p)
  28. return 1;
  29. if (val == tr[p].val)
  30. return tr[lson].size + 1;
  31. if (val < tr[p].val)
  32. return Get_Rank(lson, val);
  33. return tr[lson].size + tr[p].cnt + Get_Rank(rson, val);
  34. }
  35. int Get_Val(int p, int r) {
  36. if (!p)
  37. return INF;
  38. if (tr[lson].size >= r)
  39. return Get_Val(lson, r);
  40. if (tr[lson].size + tr[p].cnt >= r)
  41. return tr[p].val;
  42. return Get_Val(rson, r - tr[lson].size - tr[p].cnt);
  43. }
  44. void Rotate(int &p, int t) {
  45. int q = tr[p].son[!t];
  46. tr[p].son[!t] = tr[q].son[t];
  47. tr[q].son[t] = p;
  48. p = q;
  49. Update(tr[p].son[t]);
  50. Update(p);
  51. }
  52. void Insert(int &p, int val) {
  53. if (!p) {
  54. p = Get(val);
  55. return;
  56. }
  57. if (val == tr[p].val) {
  58. tr[p].cnt++;
  59. Update(p);
  60. return;
  61. }
  62. if (val < tr[p].val) {
  63. Insert(lson, val);
  64. if (tr[p].dat < tr[lson].dat)
  65. Rotate(p, 1);
  66. } else {
  67. Insert(rson, val);
  68. if (tr[p].dat < tr[rson].dat)
  69. Rotate(p, 0);
  70. }
  71. Update(p);
  72. }
  73. int Get_Pre(int x) {
  74. int p = root, ret = -INF;
  75. while (p) {
  76. if (tr[p].val <= x) {
  77. ret = tr[p].val;
  78. p = rson;
  79. } else
  80. p = lson;
  81. }
  82. return ret;
  83. }
  84. int Get_Next(int x) {
  85. int p = root, ret = INF;
  86. while (p) {
  87. if (tr[p].val >= x) {
  88. ret = tr[p].val;
  89. p = lson;
  90. } else
  91. p = rson;
  92. }
  93. return ret;
  94. }
  95. void Delete(int &p, int val) {
  96. if (!p)
  97. return;
  98. if (val == tr[p].val) {
  99. if (tr[p].cnt > 1) {
  100. tr[p].cnt--;
  101. Update(p);
  102. return;
  103. }
  104. if (lson || rson) {
  105. if (rson == 0 || tr[lson].dat > tr[rson].dat) {
  106. Rotate(p, 1);
  107. Delete(rson, val);
  108. } else {
  109. Rotate(p, 0);
  110. Delete(lson, val);
  111. }
  112. Update(p);
  113. } else
  114. p = 0;
  115. return;
  116. }
  117. if (val < tr[p].val)
  118. Delete(lson, val);
  119. else
  120. Delete(rson, val);
  121. Update(p);
  122. }
  123. #undef lson
  124. #undef rson
  125. } tree;

Template -「平衡树」的更多相关文章

  1. 「luogu3380」【模板】二逼平衡树(树套树)

    「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...

  2. Template -「整体二分」

    写的简单.主要是留给自己做复习资料. 「BZOJ1901」Dynamic Rankings. 给定一个含有 \(n\) 个数的序列 \(a_1,a_2 \dots a_n\),需要支持两种操作: Q ...

  3. 「SCOI2014」方伯伯的 OJ 解题报告

    「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...

  4. LOJ 3184: 「CEOI2018」斐波那契表示法

    题目传送门:LOJ #3184. 题意简述: 题目说得很清楚了. 题解: 首先需要了解「斐波那契数系」为何物. 按照题目中定义的斐波那契数列 \(F_n\),可以证明,每个非负整数 \(n\) 都能够 ...

  5. 「JSOI2011」任务调度

    「JSOI2011」任务调度 传送门 一开始还在想写平衡树,看到 \(\text{TRANS}\) 操作后就晓得要用可并堆了. 这题好像就是个可并堆的板子题??? ADD 直接往对应的对里面加元素 D ...

  6. 「NOI2005」维护数列

    「NOI2005」维护数列 传送门 维护过程有点像线段树. 但我们知道线段树的节点并不是实际节点,而平衡树的节点是实际节点. 所以在向上合并信息时要加入根节点信息. 然后节点再删除后编号要回退(栈), ...

  7. 「HNOI2004」宠物收养场

    「HNOI2004」宠物收养场 传送门 对宠物和人各维护一棵平衡树,每次 \(\text{split}\) 的时候记得判一下子树是否为空,然后模拟就好了. 参考代码: #include <alg ...

  8. 「TJOI2013」最长上升子序列

    「TJOI2013」最长上升子序列 传送门 这个 \(\text{DP}\) 应该都会撒: \[dp_i = \max_{j < i,a_j < a_i}\left\{dp_j\right ...

  9. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

随机推荐

  1. Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

    Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...

  2. Lab_1:练习1——理解通过make生成执行文件的过程

    lab_0 清华大学ucore实验环境配置详细步骤!(小白入) lab_1 清华大学ucore bootload启动ucore os(预备知识) Lab_1:练习1--理解通过make生成执行文件的过 ...

  3. 墙裂推荐!一款 VM 大规模集群管理工具

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Google 发布了基础设施管理工具 VM Manager,可自动维护大型Compute En ...

  4. 论文阅读 Dynamic Graph Representation Learning Via Self-Attention Networks

    4 Dynamic Graph Representation Learning Via Self-Attention Networks link:https://arxiv.org/abs/1812. ...

  5. 老生常谈系列之Aop--Spring Aop源码解析(二)

    老生常谈系列之Aop--Spring Aop源码解析(二) 前言 上一篇文章老生常谈系列之Aop--Spring Aop源码解析(一)已经介绍完Spring Aop获取advice切面增强方法的逻辑, ...

  6. Web安全学习笔记 SQL注入中

    Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...

  7. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  8. scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium

    今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...

  9. windows获取高精度时间戳 精度100ns

    #include <stdio.h> #include <Windows.h> int main(void){ LARGE_INTEGER ticks,Frequency; Q ...

  10. QC快速充电

    QC快充 一.高通QC快充的介绍 二.识别充电类型的芯片介绍 三.QC充电曲线 四.如何在log中看QC充电类型 五.QC3识别错误 六.波形图 一.高通QC快充的介绍 高通QC快充技术,又称Quic ...