treap做法,参考hzwer的博客

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. using namespace std;
  5. int n, opt, uu, rot, cnt, ans;
  6. struct Treap{
  7. int siz[100005], hav[100005], val[100005], rnd[100005], l[100005], r[100005];
  8. void upd(int x){
  9. siz[x] = siz[l[x]] + siz[r[x]] + hav[x];
  10. }
  11. void lRotate(int &k){
  12. int t=r[k]; r[k] = l[t]; l[t] = k;
  13. siz[t] = siz[k]; upd(k); k = t;
  14. }
  15. void rRotate(int &k){
  16. int t=l[k]; l[k] = r[t]; r[t] = k;
  17. siz[t] = siz[k]; upd(k); k = t;
  18. }
  19. void insert(int &k, int x){
  20. if(!k){
  21. k = ++cnt; siz[k] = hav[k] = 1;
  22. val[k] = x; rnd[k] = rand();
  23. return ;
  24. }
  25. siz[k]++;
  26. if(val[k]==x) hav[k]++;
  27. else if(val[k]<x){
  28. insert(r[k], x);
  29. if(rnd[r[k]]<rnd[k]) lRotate(k);
  30. }
  31. else{
  32. insert(l[k], x);
  33. if(rnd[l[k]]<rnd[k]) rRotate(k);
  34. }
  35. }
  36. void shanchu(int &k, int x){
  37. if(!k) return ;
  38. if(val[k]==x){
  39. if(hav[k]>1){
  40. hav[k]--; siz[k]--;
  41. return ;
  42. }
  43. else if(l[k]*r[k]==0) k = l[k] + r[k];
  44. else if(rnd[l[k]]>rnd[r[k]])
  45. lRotate(k), shanchu(k, x);
  46. else
  47. rRotate(k), shanchu(k, x);
  48. }
  49. else if(val[k]<x) siz[k]--, shanchu(r[k], x);
  50. else siz[k]--, shanchu(l[k], x);
  51. }
  52. int queryRank(int k, int x){
  53. if(x<val[k]) return queryRank(l[k], x);
  54. else if(x>val[k]) return queryRank(r[k], x)+siz[l[k]]+hav[k];
  55. else return siz[l[k]]+1;
  56. }
  57. int queryNum(int k, int x){
  58. if(x<=siz[l[k]]) return queryNum(l[k], x);
  59. else if(x>siz[l[k]]+hav[k]) return queryNum(r[k], x-siz[l[k]]-hav[k]);
  60. else return val[k];
  61. }
  62. void queryPre(int k, int x){
  63. if(!k) return ;
  64. if(val[k]<x) ans = k, queryPre(r[k], x);
  65. else queryPre(l[k], x);
  66. }
  67. void queryNxt(int k, int x){
  68. if(!k) return ;
  69. if(val[k]>x) ans = k, queryNxt(l[k], x);
  70. else queryNxt(r[k], x);
  71. }
  72. }treap;
  73. int main(){
  74. cin>>n;
  75. while(n--){
  76. scanf("%d %d", &opt, &uu);
  77. switch(opt){
  78. case 1: treap.insert(rot, uu); break;
  79. case 2: treap.shanchu(rot, uu); break;
  80. case 3: printf("%d\n", treap.queryRank(rot, uu)); break;
  81. case 4: printf("%d\n", treap.queryNum(rot, uu)); break;
  82. case 5: treap.queryPre(rot, uu); printf("%d\n", treap.val[ans]); break;
  83. case 6: treap.queryNxt(rot, uu); printf("%d\n", treap.val[ans]); break;
  84. }
  85. }
  86. return 0;
  87. }

splay做法,参照zyf2000,但是一般我们用splay都是维护区间的

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. int n, uu, vv, rot=0, sze=0;
  5. struct Splay{
  6. int s[100005][2], f[100005], siz[100005], cnt[100005], val[100005];
  7. inline void clr(int x){
  8. s[x][0] = s[x][1] = f[x] = siz[x] = cnt[x] = val[x] = 0;
  9. }
  10. inline void upd(int x){
  11. siz[x] = siz[s[x][0]] + siz[s[x][1]] + cnt[x];
  12. }
  13. inline int gx(int x){
  14. return s[f[x]][1]==x;
  15. }
  16. void rotate(int x){
  17. int old=f[x], oldf=f[old], w=gx(x);
  18. s[old][w] = s[x][w^1]; s[x][w^1] = old;
  19. f[s[old][w]] = old; f[old] = x; f[x] = oldf;
  20. if(oldf) s[oldf][s[oldf][1]==old] = x;
  21. upd(x); upd(old);
  22. }
  23. void splay(int x){
  24. int fa=1;
  25. while(fa){
  26. fa = f[x];
  27. if(!fa) break;
  28. if(f[fa])rotate((gx(x)==gx(fa))?fa:x);
  29. rotate(x);
  30. }
  31. rot = x;
  32. }
  33. void ins(int x){
  34. if(!rot){
  35. rot = ++sze; clr(rot);
  36. siz[rot] = cnt[rot] = 1; val[rot] = x;
  37. return ;
  38. }
  39. int now=rot, fa=0;
  40. while(now){
  41. if(val[now]==x){
  42. cnt[now]++; upd(now);
  43. upd(f[now]); splay(now); return ;
  44. }
  45. fa = now; now = s[now][val[now]<x];
  46. if(!now){
  47. now = ++sze; clr(now); val[now] = x; cnt[now] = siz[now] = 1;
  48. f[now] = fa; s[fa][val[fa]<x] = now; upd(fa); splay(sze);
  49. break;
  50. }
  51. }
  52. }
  53. int getRank(int x){
  54. int now=rot, ans=0;
  55. while(now){
  56. if(x<val[now]) now = s[now][0];
  57. else{
  58. ans += siz[s[now][0]];
  59. if(val[now]==x){
  60. splay(now);
  61. return ans+1;
  62. }
  63. ans += cnt[now];
  64. now = s[now][1];
  65. }
  66. }
  67. }
  68. int getNum(int x){
  69. int now=rot;
  70. while(now){
  71. if(x<=siz[s[now][0]]) now = s[now][0];
  72. else{
  73. int temp=siz[s[now][0]]+cnt[now];
  74. if(x<=temp) return val[now];
  75. x -= temp; now = s[now][1];
  76. }
  77. }
  78. }
  79. int getPre(){
  80. int now=s[rot][0];
  81. while(s[now][1]) now = s[now][1];
  82. return now;
  83. }
  84. int getNxt(){
  85. int now=s[rot][1];
  86. while(s[now][0]) now = s[now][0];
  87. return now;
  88. }
  89. void del(int x){
  90. getRank(x);
  91. if(cnt[rot]>1){
  92. cnt[rot]--; upd(rot);
  93. return ;
  94. }
  95. if(!s[rot][0] && !s[rot][1]){
  96. clr(rot); rot = sze = 0;
  97. return ;
  98. }
  99. if(!s[rot][0]){
  100. int oldr=rot; rot = s[rot][1]; f[rot] = 0; clr(oldr);
  101. return ;
  102. }
  103. if(!s[rot][1]){
  104. int oldr=rot; rot = s[rot][0]; f[rot] = 0; clr(oldr);
  105. return ;
  106. }
  107. int leftBig=getPre(), oldr=rot;
  108. splay(leftBig); s[rot][1] = s[oldr][1];
  109. f[s[rot][1]] = rot; clr(oldr); upd(rot);
  110. }
  111. }splay;
  112. int main(){
  113. cin>>n;
  114. while(n--){
  115. scanf("%d %d", &uu, &vv);
  116. switch(uu){
  117. case 1: splay.ins(vv); break;
  118. case 2: splay.del(vv); break;
  119. case 3: printf("%d\n", splay.getRank(vv)); break;
  120. case 4: printf("%d\n", splay.getNum(vv)); break;
  121. case 5: splay.ins(vv); printf("%d\n", splay.val[splay.getPre()]); splay.del(vv); break;
  122. case 6: splay.ins(vv); printf("%d\n", splay.val[splay.getNxt()]); splay.del(vv); break;
  123. }
  124. }
  125. return 0;
  126. }

luogu3369 【模板】普通平衡树(Treap/SBT) treap splay的更多相关文章

  1. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

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

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

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

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

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

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

  5. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  6. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  7. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  8. tyvj 普通平衡树 SBT or splay

    普通平衡树 From admin     背景 Background 此为平衡树系列第一道:普通平衡树     描述 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  9. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  10. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

随机推荐

  1. 【简抄】h5 新增的几个背景属性和文本属性

    一.背景图像显示: ①background-size:规定背景图像的大小: 值:像素值.百分比.auto.cover.contain ②background-origin :规定背景图像的起始位置: ...

  2. Appium基础一:Appium概念

    1.Appium介绍: Appium是一款开源跨平台(IOS和Android平台)支持多种开发语言(java.python等)进行测试Native/Web/Hybrid的Android/iOS App ...

  3. 帝国empirecms去除后台登陆认证码

    打开文件:\e\config\config.php 找到代码 $ecms_config['esafe']['loginauth']='abc'; 把值设为空即可,即改为 $ecms_config['e ...

  4. LayUI 完美兼容Vue.js

    <div id="app"> <form class="layui-form" action=""> <div ...

  5. c#在不安装Oracle客户端的情况下与服务器上的Oracle数据库交互

     概述:     C#通过使用ADO的方式在未安装Oracle数据库的前提下,客户端程序远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8. ...

  6. HDU 5091 Beam Cannon (扫描线思想)

    题意:移动一个矩形,使矩形内包含的点尽量多. 思路:把一个点拆成两个事件,一个进(权值为1)一个出(权值为-1),将所有点按照x排序,然后扫描,对于每个x,用一个滑窗计算一下最大值,再移动扫描线.树状 ...

  7. Array - Container With Most Water

    /** * 此为暴力解法 * Find two lines, which together with x-axis forms a container, such that the container ...

  8. 2019全套Java视频 免费赠送

    本人今年刚看完这套课程找到工作了 待遇还不错 现在送给大家 网盘链接:https://pan.baidu.com/s/1cEK6WoXS4F9SRgj1bZclqg提取码:bjl8希望对大家有用 一起 ...

  9. 计算机视觉2D几何基元及其变换介绍和OpenCV WarpPerspective源码分析

    2D图像几何基元 一般的,表示一个2d几何基元只用两个维度(比如x,y)就可以表示了,但是在计算机视觉研究中,为了统一对2d几何基元的操作(后面讲到的仿射,透射变换),一般会以增广矢量的方式表示几何基 ...

  10. mysql group by的特殊性

    SELECT create_year, userno , sum(sal) FROM user GROUP BY userno 以上语句,在oracle 或sql server肯定是语法错误  因为g ...