题意:

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

1.n的数据范围:n<=100000
2.每个数的数据范围:[-1e7,1e7]
 
思路:为了学LCT才去学的splay
看来又入新坑了
插入的时候把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)的更多相关文章

  1. bzoj3224 普通平衡树(splay 模板)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11427  Solved: 4878[Submit][St ...

  2. BZOJ3224:普通平衡树(Splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  3. [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)

    解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...

  4. bzoj3224 普通平衡树 splay模板

    题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...

  5. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  6. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  7. 【转】 史上最详尽的平衡树(splay)讲解与模板(非指针版spaly)

    ORZ原创Clove学姐: 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结 ...

  8. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  9. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

  10. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

随机推荐

  1. debug1: expecting SSH2_MSG_KEX_ECDH_REPLY解决

    设置mtu ifconfig en1 mtu 1200 代理工具 退出lantern,退出shadowsocks

  2. 4个Linux服务器监控工具

    下面是我想呈现给你的4个强大的监控工具. htop – 交互式进程查看器 你可能知道在机器上查看实时进程的标准工具top.如果不知道,请运行$ top看看,运行$ man top阅读帮助手册. hto ...

  3. sourcegrid统计报表画法以及EXCEL导出内容代码完全版

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. Core Foundation 框架

    Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...

  5. urlrewrite地址重写实例

    urlrewrite主要实现后天请求中的地址重写,防止被安全漏洞盲注入 http://tuckey.org/urlrewrite/ 下载最新的jar 下面是使用说明: 1.下载urlrewrite,官 ...

  6. 第五次作业:Excel制作英文课程表

    要求: 一.内外变宽线条与颜色图同,表格有底纹色彩 二.横向打印,上下左右居中,表格标题居中,表头斜线,斜线两边加文字 三.设置打开密码

  7. 总结 Swift 中随机数的使用

    在我们开发的过程中,时不时地需要产生一些随机数.这里我们总结一下Swift中常用的一些随机数生成函数.这里我们将在Playground中来做些示例演示. 整型随机数 如果我们想要一个整型的随机数,则可 ...

  8. touch-action css属性 滚动和缩放手势

    CSS 属性 touch-action 用于指定某个给定的区域是否允许用户操作,以及如何响应用户操作(比如浏览器自带的划动,缩放等) 默认情况下,平移(滚动) 和 缩放手势由浏览器专门处理.该属性用于 ...

  9. 智能指针之 weak_ptr

    1. weak_ptr 介绍 std::weak_ptr 是一种智能指针,它对被 std::shared_ptr 管理的对象存在非拥有性("弱")引用.在访问所引用的对象指针前必须 ...

  10. BZOJ3301 P2524 UVA11525 算法解释康托展开

    这三个题的代码分别对应第二个第一个第三个 在刘汝佳蓝书上我遇到了这个康托展开题. 当时去了解了一下,发现很有意思 百度上的康托展开定义 原理介绍 编辑 康托展开运算 其中, 为整数,并且 . 的意义为 ...