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

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

    在浏览器的兼容性测试中,会测试产品在不同浏览器上的兼容性,比较主流的浏览器有IE.Firefox.Chrome,Opera,Safari等.还有其它如360.QQ.遨游.百度等浏览器都是基于IE或者c ...

  2. maven打包,跳过生成javadoc

    有时候由于代码中注释错误(比如方法参数)或者maven javadoc插件版本有问题,导致打包报错,而我们着急打包验证问题,没有时间一一修改错误,这时候可以先跳过生成javadoc,继续下一步工作. ...

  3. Java学习日报7.25

    package shui; public class Shui { public static void main(String[] args) { // TODO 自动生成的方法存根 int g,s ...

  4. java零基础之--【Lombok】简化类设计神器

    I1. 在类设计中我们必不可少的要进行属性定义,构造方法,setter/getter方法,toString方法定义,如果在设计项目中属性过多则会影响类的阅读性. Lombok作为第三方插件,很好的解决 ...

  5. rocketmq 架构设计

    1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面 ...

  6. cmake的安装

    安装cmake有2种方式 安装方式1:源码安装 1.下载cmake源码包(https://cmake.org/download/),解压后进入解压目录 2.执行安装配置命令:配置软件二进制安装到/us ...

  7. k8s之DNS服务器搭建

    一.导读 在使用k8s部署springboot+redis简单应用这篇文章中,spring boot连接redis是直接使用的IP连接,那么可不可以直接使用服务名称进行连接呢?答案是可以的,这就是k8 ...

  8. Java并发包源码学习系列:CLH同步队列及同步资源获取与释放

    目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...

  9. MySQL [ERROR] Table 'mysql.user' doesn't exist

    问题描述: 在安装MYsql时,/etc/init.d/mysqld start时报错: [root@master data]# /etc/init.d/mysqld start Starting M ...

  10. mysql远程访问被拒绝问题

    远程连接MySql数据库时: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 远 ...