题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
求x的后继(后继定义为大于x,且最小的数)
输入输出格式
输入格式:
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号( 1≤opt≤6 )

输出格式:
对于操作3,4,5,6每行输出一个数,表示对应答案

输入输出样例
输入样例#1:
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
输出样例#1:
106465
84185
492737
说明
时空限制:1000ms,128M

1.n的数据范围: n≤100000
2.每个数的数据范围: [-{10}^7, {10}^7]

--------------------------------------------------------------------------------------

刚学的,不用旋转的TREAP

好写,主要就是split和merge两个操作。

可以实现可持久化。

可以实现区间操作。

据说,比splay要慢

--------------------------------------------------------------------------------------

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int maxn=1e5+5;
  4. 4 const int inf=1e9;
  5. 5 struct node
  6. 6 {
  7. 7 int ch[2],val,rd,siz;
  8. 8 }tr[maxn];
  9. 9 int n,m,l,r;
  10. 10 int tot,root;
  11. 11 int newnode(int v)
  12. 12 {
  13. 13 ++tot;
  14. 14 tr[tot].val=v;
  15. 15 tr[tot].rd=rand();
  16. 16 tr[tot].siz=1;
  17. 17 tr[tot].ch[0]=tr[tot].ch[1]=0;
  18. 18 return tot;
  19. 19 }
  20. 20 void update(int x)
  21. 21 {
  22. 22 tr[x].siz=tr[tr[x].ch[0]].siz+tr[tr[x].ch[1]].siz+1;
  23. 23 }
  24. 24 int merge(int a,int b)
  25. 25 {
  26. 26 if(a*b==0)return a+b;
  27. 27 if(tr[a].rd<tr[b].rd)
  28. 28 {
  29. 29 tr[a].ch[1]=merge(tr[a].ch[1],b);
  30. 30 update(a);
  31. 31 return a;
  32. 32 }
  33. 33 else
  34. 34 {
  35. 35 tr[b].ch[0]=merge(a,tr[b].ch[0]);
  36. 36 update(b);
  37. 37 return b;
  38. 38 }
  39. 39 }
  40. 40 void split(int cur,int k,int &x,int &y)
  41. 41 {
  42. 42 if(!cur)x=y=0;
  43. 43 else
  44. 44 {
  45. 45 if(tr[cur].val<=k)
  46. 46 {
  47. 47 x=cur;
  48. 48 split(tr[cur].ch[1],k,tr[cur].ch[1],y);
  49. 49 }
  50. 50 else
  51. 51 {
  52. 52 y=cur;
  53. 53 split(tr[cur].ch[0],k,x,tr[cur].ch[0]);
  54. 54 }
  55. 55 update(cur);
  56. 56 }
  57. 57 }
  58. 58 void insert(int v)
  59. 59 {
  60. 60 int x,y;
  61. 61 split(root,v,x,y);
  62. 62 root=merge(merge(x,newnode(v)),y);
  63. 63 }
  64. 64 void del(int v)
  65. 65 {
  66. 66 int x,y,z;
  67. 67 split(root,v,x,z);
  68. 68 split(x,v-1,x,y);
  69. 69 y=merge(tr[y].ch[0],tr[y].ch[1]);
  70. 70 root=merge(merge(x,y),z);
  71. 71 }
  72. 72 void findrank(int v)
  73. 73 {
  74. 74 int x,y;
  75. 75 split(root,v-1,x,y);
  76. 76 printf("%d\n",tr[x].siz+1);
  77. 77 root=merge(x,y);
  78. 78 }
  79. 79 int kth(int now,int k)
  80. 80 {
  81. 81 int cur=now;
  82. 82 while(cur)
  83. 83 {
  84. 84 if(tr[tr[cur].ch[0]].siz+1==k)return tr[cur].val;
  85. 85 else if(tr[tr[cur].ch[0]].siz>=k)cur=tr[cur].ch[0];
  86. 86 else
  87. 87 {
  88. 88 k-=tr[tr[cur].ch[0]].siz+1;
  89. 89 cur=tr[cur].ch[1];
  90. 90 }
  91. 91 }
  92. 92 return -inf;
  93. 93 }
  94. 94 void pre(int v)
  95. 95 {
  96. 96 int x,y;
  97. 97 split(root,v-1,x,y);
  98. 98 printf("%d\n",kth(x,tr[x].siz));
  99. 99 root=merge(x,y);
  100. 100 }
  101. 101 void suc(int v)
  102. 102 {
  103. 103 int x,y;
  104. 104 split(root,v,x,y);
  105. 105 printf("%d\n",kth(y,1));
  106. 106 root=merge(x,y);
  107. 107 }
  108. 108 int main()
  109. 109 {
  110. 110 srand((unsigned)time(NULL));
  111. 111 int n,op,v;
  112. 112 scanf("%d",&n);
  113. 113 while(n--)
  114. 114 {
  115. 115 scanf("%d%d",&op,&v);
  116. 116 switch(op)
  117. 117 {
  118. 118 case 1:insert(v);break;
  119. 119 case 2:del(v);break;
  120. 120 case 3:findrank(v);break;
  121. 121 case 4:printf("%d\n",kth(root,v));break;
  122. 122 case 5:pre(v);break;
  123. 123 case 6:suc(v);break;
  124. 124 default:break;
  125. 125 }
  126. 126 }
  127. 127 return 0;
  128. 128 }

luogu p3369的更多相关文章

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

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

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

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

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

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

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

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

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

    题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...

  6. luogu P3369 【模板】普通平衡树(splay)

    嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...

  7. 普通平衡树Tyvj1728、luogu P3369 (splay)

    存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...

  8. 普通平衡树Tyvj1728、luogu P3369 (treap)

    您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的 ...

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

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  10. 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 题解 pb_ds

    我永远都爱STL ! 我爱PB_DS ! #include <iostream> #include <cstdio> #include <ext/pb_ds/tree_p ...

随机推荐

  1. 【mysql】- Expalin篇

    简介 id:在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的id 与查询优化器有关,假如被优化过,那么可能是上下两个的id都是一样的 select_type:SELECT 关键字对应的那 ...

  2. Python错误重试方法

    前言 Tenacity是一个 Apache 2.0授权的通用重试库,用 Python 编写,用于简化向几乎所有内容添加重试行为的任务.它起源于一个重新尝试的分支,可惜这个分支已经不复存在了. 使用Te ...

  3. Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue

    一,引言 在之前上一篇讲解到 Azure ServiceBus Queue 中,我们实地的演示了在控制台中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service ...

  4. druid监控

    1 @ConfigurationProperties(prefix = "spring.datasource") 2 @Bean 3 public DataSource druid ...

  5. RocketMQ 简介

    本文根据阿里云 RocketMQ产品文档整理 地址:https://help.aliyun.com/document_detail/29532.html?userCode=qtldtin2 简介 Ro ...

  6. CTF常见编码及加解密(超全)

    @ 目录 前言 常见CTF编码及加解密 补充 ASCII编码 base家族编码 MD5.SHA1.HMAC.NTLM等类似加密型 1.MD5 2.SHA1 3.HMAC 4.NTLM 5.类似加密穷举 ...

  7. 【SpringBoot1.x】SpringBoot1.x 消息

    SpringBoot1.x 消息 文章源码 概述 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 消息服务有两个重要概念,即消息代理(message broker)和目的地(des ...

  8. 通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)

    我写的书不算少,写的博文就更多了,但大多数书的销量也就一般,而我写的技术文章里,虽然也有点击过万的,但不少点击量也就只有三位数. 通过不断反思,也通过对比了一些畅销书和顶流文章,我似乎找到了一些原因, ...

  9. 剑指offer-查找数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  10. 深入汇编指令理解Java关键字volatile

    volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...