【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,终于做对 ...
随机推荐
- Educational Codeforces Round 12补题 经典题 再次爆零
发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...
- poj3264 划分树
题意: 给定一个序列,询问区间中最大数减去最小数的结果 和2104差不多, 代码贴过来就OK了 #include <iostream> #include <algorithm> ...
- (八)VMware harbor 成员管理
(一)VMware harbor 成员管理 可以给项目添加成员,成员必须是已经注册的成员. 添加成员后,成员就会有4种角色:项目管理员,维护人员,开发人员,访客. 1.1 新建成员 1.2 修改角色 ...
- 看paper的网址
http://www.arxiv-sanity.com/ https://scirate.com/ google搜cvpr open access.iccv open access
- Java截取视频文件缩略图
/** * 截取视频第0帧的图片 */public static void videoImage(String filePath, String fileName,int widthdist, int ...
- apache 报413
http://www.hostlift.com/apache/modsecurity-request-body-content-length-is-larger-than-the-configured ...
- css flew 布局 解决父元素高度不固定,子级居中。
给父级添加 display: flex; justify-content: flex-start; align-items: center; 子级里的内容永远居中
- 【DB_MySQL】MySQL重要知识点
MySQL中的select语句 各子句的执行顺序 SELECT语句的处理过程 1. FROM 组装数据来源 2. WHERE筛选元组 3. GROUP BY 将满足条件的元组进行分组 4. HAVIN ...
- (37)zabbix snmp类型 无需安装agent也能监控
概述 如果我们需要监控打印机.路由器.UPS等设备,肯定不能使用zabbix agentd,因为他们不能安装软件的,还好他们一般都支持SNMP协议,这样我可以使用SNMP来监控他们.如果你希望使用SN ...
- perl学习之五:列表和数组
列表及其形式 数组 数组的赋值 数组的读取 数组片段 数组函数 二维数组简介 总结 1.列表形式: 1.(item1,item2,...) 2.qw(item1 item2 item3 ...) 3. ...