【BZOJ3224】普通平衡树(splay)
题意:
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
var t:array[..,..]of longint;
sum,b,fa,num:array[..]of longint;
n,i,x,y,root,cnt,save,tmp,m:longint;
flag:boolean; procedure pushup(x:longint);
var l,r:longint;
begin
l:=t[x,]; r:=t[x,];
sum[x]:=sum[l]+sum[r]+;
end; procedure rotate(x:longint;var k:longint);
var y,z,l,r:longint;
begin
y:=fa[x]; z:=fa[y];
if t[y,]=x then l:=
else l:=;
r:=l xor ;
if y<>k then
begin
if t[z,]=y then t[z,]:=x
else t[z,]:=x;
end
else k:=x;
fa[t[x,r]]:=y; fa[x]:=z; fa[y]:=x;
t[y,l]:=t[x,r]; t[x,r]:=y;
pushup(y);
pushup(x);
end; procedure splay(x:longint;var k:longint);
var y,z:longint;
begin
while x<>k do
begin
y:=fa[x]; z:=fa[y];
if y<>k then
begin
if (t[z,]=y)xor(t[y,]=x) then rotate(x,k)
else rotate(y,k);
end
else k:=x;
rotate(x,k);
end; end; function pred(x:longint):longint;
var k,last:longint;
begin
k:=root; last:=num[root];
while k<> do
begin
if num[k]<x then begin last:=num[k]; k:=t[k,]; end
else k:=t[k,];
end;
exit(last);
end; function succ(x:longint):longint;
var k,last:longint;
begin
k:=root; last:=num[root];
while k<> do
begin
if num[k]>x then begin last:=num[k]; k:=t[k,]; end
else k:=t[k,];
end;
exit(last);
end; function rank(x:longint):longint;
var k:longint;
begin
x:=pred(x);
k:=root; rank:=;
while k> do
begin
if num[k]<=x then begin rank:=rank+sum[t[k,]]+; k:=t[k,]; end
else k:=t[k,];
end;
inc(rank);
end; function kth(x:longint):longint;
var tmp,k:longint;
begin
k:=root;
while true do
begin
tmp:=sum[t[k,]]+;
if tmp=x then exit(k);
if tmp>x then k:=t[k,]
else
begin
k:=t[k,]; x:=x-tmp;
end;
end;
end; function find(x:longint):longint;
var k:longint;
begin
k:=root;
while true do
begin
if num[k]=x then exit(k)
else if num[k]<x then k:=t[k,]
else k:=t[k,];
end;
end; procedure ins(x:longint);
var tmp,l,r,k1:longint;
begin
tmp:=rank(x);
l:=kth(tmp-);
r:=kth(tmp);
splay(l,root);
splay(r,t[root,]);
k1:=t[root,];
inc(cnt); t[k1,]:=cnt; fa[cnt]:=k1; sum[cnt]:=; num[cnt]:=x;
// inc(sum[k1]);
// inc(sum[root]);
end; procedure del(x:longint);
var k1,k2,l,r:longint;
begin
tmp:=rank(x);
l:=kth(tmp-);
r:=kth(tmp+);
splay(l,root);
splay(r,t[root,]);
k1:=t[root,]; k2:=t[k1,];
sum[k1]:=sum[t[k1,]]+; fa[k2]:=; sum[k2]:=;
t[k1,]:=; fa[k2]:=; sum[k2]:=; t[k2,]:=; t[k2,]:=; end; begin
assign(input,'bzoj3224.in'); reset(input);
assign(output,'bzoj3224.out'); rewrite(output);
readln(n);
num[]:=maxlongint; sum[]:=; t[,]:=; t[,]:=;
num[]:=-maxlongint; sum[]:=; fa[]:=;
num[]:=maxlongint; sum[]:=; fa[]:=; root:=; cnt:=;
for i:= to n do
begin
readln(x,y);
case x of
:
begin
ins(y);
inc(m);
end;
:
begin
del(y);
dec(m);
end; :writeln(rank(y)-); :writeln(num[kth(y+)]);
:writeln(pred(y));
:writeln(succ(y));
end;
end;
close(input);
close(output);
end.
UPD(2018.9.15):C++
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 500000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 2e9 int t[N][],size[N],fa[N],num[N],root,cnt; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void pushup(int x)
{
size[x]=size[t[x][]]+size[t[x][]]+;
} void rotate(int x,int &k)
{
int y=fa[x];
int z=fa[y];
int l;
if(t[y][]==x) l=;
else l=;
int r=l^;
if(y!=k)
{
if(t[z][]==y) t[z][]=x;
else t[z][]=x;
}
else k=x;
fa[t[x][r]]=y; fa[x]=z; fa[y]=x;
t[y][l]=t[x][r]; t[x][r]=y;
pushup(y);
pushup(x);
} void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x];
int z=fa[y];
if(y!=k)
{
if((t[z][]==y)^(t[y][]==x)) rotate(x,k);
else rotate(y,k);
}
else k=x;
rotate(x,k);
}
} int pred(int x)
{
int k=root;
int last=num[root];
while(k)
{
if(num[k]<x){last=num[k]; k=t[k][];}
else k=t[k][];
}
return last;
} int succ(int x)
{
int k=root;
int last=num[root];
while(k)
{
if(num[k]>x){last=num[k]; k=t[k][];}
else k=t[k][];
}
return last;
} int rank(int x)
{
x=pred(x);
int k=root;
int s=;
while(k)
{
if(num[k]<=x){s+=size[t[k][]]+; k=t[k][];}
else k=t[k][];
}
s++;
return s;
} int kth(int x)
{
int k=root;
while()
{
int tmp=size[t[k][]]+;
if(tmp==x) return k;
if(tmp>x) k=t[k][];
else{k=t[k][]; x-=tmp;}
}
} void Insert(int x)
{
int tmp=rank(x);
int l=kth(tmp-);
int r=kth(tmp);
splay(l,root);
splay(r,t[root][]);
int k=t[root][];
t[k][]=++cnt; fa[cnt]=k; size[cnt]=; num[cnt]=x;
} void Delete(int x)
{
int tmp=rank(x);
int l=kth(tmp-);
int r=kth(tmp+);
splay(l,root);
splay(r,t[root][]);
int k1=t[root][];
int k2=t[k1][];
size[k1]=size[t[k1][]]+; t[k1][]=;
fa[k2]=; size[k2]=;
t[k2][]=; t[k2][]=;
} int main()
{
//freopen("bzoj3224.in","r",stdin);
//freopen("bzoj3224.out","w",stdout);
int n;
scanf("%d",&n);
num[]=-oo; size[]=; t[][]=;
num[]=oo; size[]=; fa[]=;
root=; cnt=;
for(int i=;i<=n;i++)
{
int x,y,ans;
scanf("%d%d",&x,&y);
if(x==) Insert(y);
if(x==) Delete(y);
if(x==)
{
ans=rank(y)-;
printf("%d\n",ans);
}
if(x==)
{
ans=num[kth(y+)];
printf("%d\n",ans);
}
if(x==)
{
ans=pred(y);
printf("%d\n",ans);
}
if(x==)
{
ans=succ(y);
printf("%d\n",ans);
}
}
}
【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,终于做对 ...
随机推荐
- @ConditionalOnProperty来控制Configuration是否生效
1. 简介 Spring Boot通过@ConditionalOnProperty来控制Configuration是否生效 2. 说明 @Retention(RetentionPolicy.RUNTI ...
- WPF中在后台实现控件样式
加入现在有一个Button的样式如下: <Style TargetType="{x:Type Button}" x:Key="MyButton">. ...
- zust_第二周——瞎扯系列
首先来原题列表: A:Gridland http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1037 B:HangOver htt ...
- bootstrap 两端对齐的导航
您可以在屏幕宽度大于768px时,通过在分别使用.nav .nav-tabs或.nav .nav-pills的同时使用class.nav-justified,让标签式或胶囊式导航菜单与父元素等宽,在更 ...
- 一. python基础知识
第一章.变量与判断语句 1.第一个python程序 # -*- coding:utf-8 -*- # Author: Raymond print ("hello world") p ...
- FTP文传协议的应用
我开发的项目中一直用到都是AFNetworking上传图片的方法,最近老大说要用FTP上传,网上的资料很少,毕竟这种上传方式现在用的不多了,于是花了一天时间学习了FTP文件传输协议.下面是我的个人理解 ...
- 经典的7种排序算法 原理C++实现
排序是编程过程中经常遇到的操作,它在很大程度上影响了程序的执行效率. 7种常见的排序算法大致可以分为两类:第一类是低级排序算法,有选择排序.冒泡排序.插入排序:第二类是高级排序算法,有堆排序.排序树. ...
- MySQL 上移/下移/置顶
在编写网站系统时,难免会用到上移.下移.置顶的功能,今天小编就介绍一下我的思路. 首先,需要一张数据表: CREATE TABLE `a` ( `id` ) NOT NULL AUTO_INCREME ...
- shell脚本中使用echo显示带颜色的内容
shell脚本中使用echo显示带颜色的内容,需要使用参数-e 格式如下: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m" 例如: echo -e &qu ...
- 【Charles】使用Charles时,抓不到包的情况。
有可能是因为浏览器的代理权限给了其他插件,需要停用该插件,重启浏览器,重新进行访问就可以看到Charles的抓包信息了.