LOJ104 普通平衡树
题目描述
这是一道模板题。
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
- 插入 x 数;
- 删除 x 数(若有多个相同的数,因只删除一个);
- 查询 x 数的排名(若有多个相同的数,因输出最小的排名);
- 查询排名为 x 的数;
- 求 x 的前趋(前趋定义为小于 x,且最大的数);
- 求 x 的后继(后继定义为大于 x,且最小的数)。
输入格式
第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x, 表示操作的序号(1<=opt<=6)。
输出格式
对于操作 3、4、5、6 每行输出一个数,表示对应答案。
样例
样例输入
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
样例输出
106465
84185
492737
数据范围与提示
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 struct node
5 {
6 int val,lc,rc,siz,rd;
7 }tr[maxn];
8 int cnt,root,n;
9 int newnode(int v)
10 {
11 ++cnt;
12 tr[cnt].val=v;
13 tr[cnt].siz=1;
14 tr[cnt].rd=rand();
15 tr[cnt].lc=tr[cnt].rc=0;
16 return cnt;
17 }
18 void update(int cur)
19 {
20 tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
21 }
22 int merge(int x,int y)
23 {
24 if(x*y==0)return x+y;
25 if(tr[x].rd<tr[y].rd)
26 {
27 tr[x].rc=merge(tr[x].rc,y);
28 update(x);
29 return x;
30 }
31 else
32 {
33 tr[y].lc=merge(x,tr[y].lc);
34 update(y);
35 return y;
36 }
37 }
38 void split(int cur,int v,int &x,int &y)
39 {
40 if(!cur)x=y=0;
41 else
42 {
43 if(tr[tr[cur].lc].siz+1<=v)
44 {
45 x=cur;
46 split(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
47 update(cur);
48 }
49 else
50 {
51 y=cur;
52 split(tr[cur].lc,v,x,tr[cur].lc);
53 update(cur);
54 }
55 }
56 }
57 void splitv(int cur,int v,int &x,int &y)
58 {
59 if(!cur)x=y=0;
60 else
61 {
62 if(tr[cur].val<=v)
63 {
64 x=cur;
65 splitv(tr[cur].rc,v,tr[cur].rc,y);
66 update(cur);
67 }
68 else
69 {
70 y=cur;
71 splitv(tr[cur].lc,v,x,tr[cur].lc);
72 update(cur);
73 }
74 }
75 }
76 void insert(int v)
77 {
78 int x,y;
79 splitv(root,v,x,y);
80 root=merge(merge(x,newnode(v)),y);
81 }
82 void del(int v)
83 {
84 int x,y,z;
85 splitv(root,v,x,z);
86 splitv(x,v-1,x,y);
87 y=merge(tr[y].lc,tr[y].rc);
88 root=merge(merge(x,y),z);
89 }
90 void find(int v)
91 {
92 int x,y;
93 splitv(root, v-1,x,y);
94 printf("%d\n",tr[x].siz+1);
95 root=merge(x,y);
96 }
97 void kth(int now,int v)
98 {
99 int cur=now;
100 if(v>tr[now].siz || v<1)return ;
101 while(cur)
102 {
103 if(tr[tr[cur].lc].siz+1==v)
104 {
105 printf("%d\n",tr[cur].val);
106 return ;
107 }
108 else if(tr[tr[cur].lc].siz >= v)cur=tr[cur].lc;
109 else
110 {
111 v-=tr[tr[cur].lc].siz+1;
112 cur=tr[cur].rc;
113 }
114 }
115 }
116 void pre(int v)
117 {
118 int x,y,z;
119 splitv(root,v-1,x,y);
120 kth(x,tr[x].siz);
121 root=merge(x,y);
122 }
123 void next(int v)
124 {
125 int x,y,z;
126 splitv(root,v,x,y);
127 kth(y,1);
128 root=merge(x,y);
129 }
130 int main()
131 {
132 scanf("%d",&n);
133 for(int op,x,i=0;i<n;++i)
134 {
135 scanf("%d%d",&op,&x);
136 if(op==1)insert(x);
137 else if(op==2)del(x);
138 else if(op==3)find(x);
139 else if(op==4)kth(root,x);
140 else if(op==5)pre(x);
141 else next(x);
142 }
143 return 0;
144 }
LOJ104 普通平衡树的更多相关文章
- BZOJ3224/LOJ104 普通平衡树 pb_ds库自带红黑树
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- BZOJ3224/LOJ104 普通平衡树 treap(树堆)
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- 【Splay】bzoj3223-Tyvj1729文艺平衡树
一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...
随机推荐
- 多人VNC远程桌面服务配置
博主前篇博客里面已经讲过VNC的配置,为了方便查看,单独拿出来写一下. (1) 搜索可以用来安装vncserver的软件包: sudo apt-cache search vncserver (2) 安 ...
- spark集群运行模式
spark的集中运行模式 Local .Standalone.Yarn 关闭防火墙:systemctl stop firewalld.service 重启网络服务:systemctl restart ...
- JVM内存设置多大合适?Xmx和Xmn如何设置?
JVM内存设置多大合适?Xmx和Xmn如何设置? 问题:新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析:依 ...
- spring boot 部署到tomcat
网上很多文章描述过,当我按步骤做时会抛各种错误,最后记录下我的做法(成功发布到本地 Tomcat9 ): 1.将项目的启动类Application.java继承SpringBootServletIni ...
- kafka如何保证消息得顺序性
1. 问题 比如说我们建了一个 topic,有三个 partition.生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到 ...
- python之shutil 模块
一.shutil 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import shutil s ...
- 线程专题 -- 线程池,ThreadPoolExecutor
什么是线程池? 为什么要使用它? 线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入"池"中,当有任务来临时就可以重用已有的线程,无需 ...
- IE浏览器F12无法使用
原文链接http://zhhll.icu/2020/04/07/windows/IE%E6%B5%8F%E8%A7%88%E5%99%A8F12%E6%97%A0%E6%B3%95%E4%BD%BF% ...
- 关于.NET中的控制反转(三)- 依赖注入之 Autofac
一.Autofac简介 Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成.Autofac的主要特性如下: 组件侵入性为零 ...
- CentOS7上安装jdk,mysql
最近笔者的云服务器由于中毒,重装系统了... 所以就记录下所有服务的搭建过程吧 1.安装jdk 在oracle上下载linux系统的jdk,笔者这里使用的是1.8 https://www.oracle ...