luogu p3369
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入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的更多相关文章
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...
- luogu P3369 【模板】普通平衡树(splay)
嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...
- 普通平衡树Tyvj1728、luogu P3369 (splay)
存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...
- 普通平衡树Tyvj1728、luogu P3369 (treap)
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的 ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 模板 Scapegoat Tree
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 题解 pb_ds
我永远都爱STL ! 我爱PB_DS ! #include <iostream> #include <cstdio> #include <ext/pb_ds/tree_p ...
随机推荐
- ESP8288-01S/ESP8288-01使用经验总结
如图:ESP8288-01S/ESP8288-01的区别 超链接 ESP8288-01S/ESP8288-01是乐鑫公司推出的Wi-Fi模块,因为价格便宜迅速占领了市场,它可以做AT指令开发,也可以做 ...
- 美团关于分布式ID实践方案细节
摘自https://tech.meituan.com/2019/03/07/open-source-project-leaf.html Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自 ...
- File对象目录列表器
/****File对象即能代表一个文件又能代表一组目录下的特定文件集:如果它代表一组文件那可以用list方法返回一组字符数组,数组内的对象是该目录下的符合条件的每个文件. 为什么说符合条件下这个前提呢 ...
- Sql语句模糊查询字符串的两种写法
Sql语句模糊查询有两种写法,一种是在jdbcTemplate的查询方法参数里拼接字符串%,一种是在Sql语句里拼接%字符串. public class IsNameDaoImpl implement ...
- Ubuntu20.04编译ffmpeg
1.安装编译所需工具,GCC 2.安装yasm nasm yasm和nasm是两个编译器,编译ffmpeg需要用到 安装命令: sudo aptitude install yasm nasm 3.安装 ...
- GitHub上的开源复刻:暗黑破坏神2
现在的00后少年可能已经不太了解<暗黑破坏神2>这款由暴雪打造的经典游戏. 该游戏上市的时候,国内个人家用电脑还没有那么普及,网络游戏也没有那么风靡,现在的孩子可能无法想象,那时候网吧里的 ...
- 上班如何优雅的使用idea刷LeetCode(力扣)
打开idea file->setting ->plugins 搜索 "LeetCode" install "LeetCode editor" 重启后 ...
- 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录
风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...
- Socket粘包问题终极解决方案—Netty版(2W字)!
上一篇我们讲了<Socket粘包问题的3种解决方案>,但没想到评论区竟然炸了.介于大家的热情讨论,以及不同的反馈意见,本文就来做一个扩展和延伸,试图找到问题的最优解,以及消息通讯的最优解决 ...
- 对Java集合的概述
前言 大部分编程语言都提供了数组来保存对象,数组是非常重要的数据结构之一.但是数组在初始化时就已经定义了数组长度,不可变,使用起来颇为麻烦.因此,Java 在 JDK 1.2 版本中添加了集合框架,用 ...