BZOJ3224普通平衡树【Splay】
3224: Tyvj 1728 普通平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 11751 Solved: 5013
Description
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
Input
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)
Output
对于操作3,4,5,6每行输出一个数,表示对应答案
Sample Input
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
84185
492737
HINT
#include<iostream>
#include<cstdio>
using namespace std;
;
,root=;
inline void update(int x)
{
size[x]=num[x];
if(lch[x])size[x]+=size[lch[x]];
if(rch[x])size[x]+=size[rch[x]];
}
inline void zig(int x)///x==lch[f]
{
int f=F[x],gf=F[f];
F[f]=x;
F[x]=gf;
if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x;
lch[f]=rch[x];
F[rch[x]]=f;
rch[x]=f;
update(f);
update(x);
}
inline void zag(int x)///x==rch[f]
{
int f=F[x],gf=F[f];
F[f]=x;
F[x]=gf;
if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x;
rch[f]=lch[x];
F[lch[x]]=f;
lch[x]=f;
update(f);
update(x);
}
inline void splay(int x)
{
int f,gf;
)
{
f=F[x];
gf=F[f];
)
{
if(x==lch[f]) zig(x);
else zag(x);
break;
}
if(f==lch[gf]&&x==lch[f]){zig(f);zig(x);}
else if(f==rch[gf]&&x==rch[f]){zag(f);zag(x);}
else if(f==rch[gf]&&x==lch[f]){zig(x);zag(x);}
else{zag(x);zig(x);}
}
root=x;
}
inline int find(int x)
{
int p=root;
while(x!=key[p])
{
if(x<key[p])
{
) break;
else p=lch[p];
}
else
{
) break;
else p=rch[p];
}
}
return p;
}
inline void ins(int x)
{
)
{
key[++sz]=x;
size[]=;
num[]=;
root=;
F[sz]=;
return;
}
int p=find(x);
if(key[p]!=x)
{
key[++sz]=x;
num[sz]=;
F[sz]=p;
if(x<key[p]) lch[p]=sz;
else rch[p]=sz;
lch[sz]=rch[sz]=;
p=sz;
}
num[p]++;
update(p);
update(F[p]);
splay(p);
}
inline int findmax(int p)
{
) p=rch[p];
return p;
}
inline int findmin(int p)
{
) p=lch[p];
return p;
}
inline void del(int x)
{
int p=find(x);
splay(p);
num[p]--;
)
{
int f=F[p];
) {root=rch[p];F[rch[p]]=;}
) {root=lch[p];F[lch[p]]=;}
else
{
int l=findmax(lch[p]),r=rch[p];
F[lch[p]]=;
splay(l);
rch[l]=r;
F[r]=l;
update(l);
}
}
}
inline int findn(int x,int p)
{
if(size[lch[p]]<x&&x<=size[lch[p]]+num[p]) return p;
else if(x<=size[lch[p]]) return findn(x,lch[p]);
else if(rch[p]) return findn(x-size[lch[p]]-num[p],rch[p]);
}
int main()
{
int t,n,p,x;
scanf("%d",&n);
;i<=n;i++)
{
scanf("%d%d",&t,&x);
) ins(x);
) del(x);
) {splay(find(x));printf();}
) printf("%d\n",key[findn(x,root)]);
) {ins(x);printf("%d\n",key[findmax(lch[root])]);del(x);}
) {ins(x);printf("%d\n",key[findmin(rch[root])]);del(x);}
}
;
}
BZOJ3224普通平衡树【Splay】的更多相关文章
- bzoj3224 普通平衡树(splay 模板)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11427 Solved: 4878[Submit][St ...
- BZOJ3224:普通平衡树(Splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- bzoj3224 普通平衡树 splay模板
题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- 【转】 史上最详尽的平衡树(splay)讲解与模板(非指针版spaly)
ORZ原创Clove学姐: 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结 ...
- hiho #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
随机推荐
- C# 获取文件MD5与SHA1
之前刚开始学习编程的时候,总想着自己写一些小软件小工具. 而这个就是经典的文件MD5校验,顺便加上了一个SHA1. 在网络上下载一些东西时,会有作者提供MD5值. 它的作用就在于我们可以在下载该软件后 ...
- js设计模式--工厂模式
工厂模式: 工厂模式的目的是为了创建对象,它经常是在类和类的方法中实现.简单的工厂模式是由一个方法来决定到底要创建哪类的实例,这些实例经常拥有相同的接口,这种模式在所实例化的类型在编译期并不确定,而是 ...
- java程序员--小心你代码中的内存泄漏
当你从c&c++转到一门具有垃圾回收功能的语言时,程序员的工作就会变得更加容易,因为你用完对象,他们会被自动回收,但是,java程序员真的不需要考虑内存泄露吗? 其实不然 1.举个例子-看你能 ...
- Protege5.0.0入门学习
OWL本体的重要组成部分 Individuals:个体,代表一个领域里面的对象.可以理解成一个类的实例(instances of classes). Properties:属性,是两个个体之间的双重联 ...
- 架构师之路——里氏替换原则LSP
定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- 数据库 t-sql 语句
sql 高级语句 在基础语句上加上条件 条件修改: update 表名set 列明=要修改的值 where 列名 =原来的值 条件删除 删除 这个值的的一行 delete from 表名 ...
- 加入大型的js文件如jQuery文件,Eclipse会报错
在使用Eclipse3.7及以后的版本的时候,加入大型的js文件如jQuery文件,会报错(missing semicolon),文件中会显示红色小X,虽然这个错误并不会影响项目的运行,但是这个却会大 ...
- 1741: [Usaco2005 nov]Asteroids 穿越小行星群
1741: [Usaco2005 nov]Asteroids 穿越小行星群 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 231 Solved: 166 ...
- java+++IO流操作
序:IO流的操作主要分为两种读和写.一方面:我们可以通过不加缓冲类字符流BufferedReader/Writer和字节流BufferedInputStream/OutputStream来进行简单的读 ...