您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
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 Input10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output106465
84185
492737
Hint

1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]
 
不多说了,模板练习。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
struct Splay{
int ch[maxn][],fa[maxn],num[maxn],sz[maxn],key[maxn],rt,cnt;
int get(int x) { return ch[fa[x]][]==x;}
Splay(){ rt=cnt=; }
void update(int Now)
{
if(!Now) return ;
sz[Now]=num[Now];
if(ch[Now][]) sz[Now]+=sz[ch[Now][]];
if(ch[Now][]) sz[Now]+=sz[ch[Now][]];
}
void rotate(int x)
{
int old=fa[x],fold=fa[old],opt=(ch[old][]==x);
fa[ch[x][opt^]]=old; ch[old][opt]=ch[x][opt^];
ch[x][opt^]=old; fa[old]=x; fa[x]=fold;
if(fold) ch[fold][ch[fold][]==old]=x;
else rt=x;
update(old); update(x);
}
void splay(int x,int y)
{
for(int f;(f=fa[x])!=y;rotate(x)){
if(fa[f]!=y)
rotate(get(x)==get(f)?f:x);
}
if(!y) rt=x;
}
void insert(int x)
{
if(!rt){
rt=++cnt; key[cnt]=x; sz[cnt]=num[cnt]=; return ;
}
int Now=rt,f=;
while(true){
if(key[Now]==x){
num[Now]++; update(Now); update(f); splay(Now,); return;
}
f=Now; Now=ch[Now][key[Now]<x];
if(!Now) {
fa[++cnt]=f; ch[f][key[f]<x]=cnt; num[cnt]=sz[cnt]=;
key[cnt]=x; update(f); splay(cnt,); return ;
}
}
}
void del(int x)
{
int whatever=find(x);
if(num[rt]>){num[rt]--; update(rt); return;}
if(!ch[rt][]&&!ch[rt][]) { rt=; return;}
if(!ch[rt][]){
int oldroot=rt; rt=ch[rt][]; fa[rt]=; return;
}
else if (!ch[rt][]){
int oldroot=rt; rt=ch[rt][]; fa[rt]=; return;
}
int leftbig=pre(),oldroot=rt;
splay(leftbig,);
ch[rt][]=ch[oldroot][];
fa[ch[oldroot][]]=rt;
update(rt);
}
int find(int x)
{
int Now=rt,res=;
while(true){
if(x<key[Now]) Now=ch[Now][];
else {
res+=ch[Now][]?sz[ch[Now][]]:;
if(key[Now]==x) {
splay(Now,);return res+;
}
res+=num[Now]; Now=ch[Now][];
}
}
}
int findx(int x)
{
int Now=rt;
while(true){
if(ch[Now][]&&sz[ch[Now][]]>=x) Now=ch[Now][];
else {
if(ch[Now][]) x-=sz[ch[Now][]];
if(num[Now]>=x) return key[Now];
x-=num[Now];
Now=ch[Now][];
}
}
}
int pre()
{
int Now=ch[rt][];
while(ch[Now][]) Now=ch[Now][];
return Now;
}
int nxt()
{
int Now=ch[rt][];
while(ch[Now][]) Now=ch[Now][];
return Now;
}
}S;
int main()
{
int N,opt,x;
scanf("%d",&N);
while(N--){
scanf("%d%d",&opt,&x);
switch(opt){
case : S.insert(x); break;
case : S.del(x); break;
case : printf("%d\n",S.find(x)); break;
case : printf("%d\n",S.findx(x)); break;
case : S.insert(x); printf("%d\n",S.key[S.pre()]); S.del(x);break;
case : S.insert(x); printf("%d\n",S.key[S.nxt()]); S.del(x);break;
}
}
return ;
}

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. MD5散列算法的示例

    在很多地方,都用到了数据加密,比较多的就是MD5了,也比较安全,下面就贴上个示例,输入一串字符串,通过MD5加密 加密算法如下 public static string MD5_Encrypt(str ...

  2. UVA624 CD,01背包+打印路径,好题!

    624 - CD 题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌. 思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记 ...

  3. [luoguP2129] L国的战斗续之多路出击(模拟 || 矩阵)

    传送门 1.模拟 easy #include <cstdio> #define N 500001 int n, m; int X[N], Y[N], x[N], y[N], a = 1, ...

  4. [luoguP2736] “破锣摇滚”乐队 Raucous Rockers(DP)

    传送门 f[i][j]表示前i首歌放到前j个盘里最多能放多首 ntr[i][j]表示i~j中最多能放进一张盘中多少首歌 ntr数组可以贪心预处理出来. #include <cstdio> ...

  5. Session保存用户名到Session域对象中

    Session保存用户名 1.构造登录界面 用户名: 密   码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE html> < ...

  6. RedisDesktopManager 踩坑之旅

    虚拟机上装了redis, 本地Windows的RedisDesktopManager  connect failed. 解决方法: 1.修改 redis.conf 文件 bind 127.0.0.1 ...

  7. Hashtable和HashMap 的区别

    Hashtable和HashMap 第一点不同 主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. 第二点不同 (也许 ...

  8. HDU 1402 大数乘法 FFT、NTT

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. 洛谷——P1451 求细胞数量

    P1451 求细胞数量 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=10 ...

  10. The Bottom of a Graph

                                    poj——The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K ...