题目描述

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

1.插入 xx 数

2.删除 xx 数(若有多个相同的数,因只删除一个)

3.查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 。若有多个相同的数,因输出最小的排名)

4.查询排名为 xx 的数

5.求 xx 的前驱(前驱定义为小于 xx ,且最大的数)

6.求 xx 的后继(后继定义为大于 xx ,且最小的数)

输入输出格式

输入格式:

第一行为 nn ,表示操作的个数,下面 nn 行每行有两个数 optopt 和 xx , optopt 表示操作的序号( 1 \leq opt \leq 6 1≤opt≤6 )

输出格式:

对于操作 3,4,5,63,4,5,6 每行输出一个数,表示对应答案

输入输出样例

输入样例#1:

10

1 106465

4 1

1 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

输出样例#1:

106465

84185

492737

说明

code:

//By Menteur_Hxy
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define C(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nex[i])
using namespace std; inline LL rd() {
LL x=0,fla=1; char c=' ';
while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();
return x*fla;
} inline void out(LL x){
int a[25],wei=0;
if(x<0) putchar('-'),x=-x;
for(;x;x/=10) a[++wei]=x%10;
if(wei==0){ puts("0"); return;}
for(int j=wei;j>=1;--j) putchar('0'+a[j]);
putchar('\n');
}
/*--splay_begin--*/
#define check(x) (x==nd[fa[x]][1])
#define clear(x) key[x]=cnt[x]=siz[x]=fa[x]=nd[x][1]=nd[x][0]=0
#define update(x) siz[x]=siz[nd[x][1]]+siz[nd[x][0]]+cnt[x]
const int N=100005;
int key[N],cnt[N],siz[N],fa[N],nd[N][2];
int size,root; inline int newnode(int x) {key[++size]=x,cnt[size]=siz[size]=1;return size;}
inline void rotate(int x) { int old=fa[x],oldf=fa[old];
bool wh=check(x);
fa[nd[x][wh^1]]=old; nd[old][wh]=nd[x][wh^1];
nd[x][wh^1]=old; fa[old]=x; fa[x]=oldf;
if(oldf) nd[oldf][nd[oldf][1]==old]=x;
update(old);update(x);
}
inline void splay(int x) {
for(int f=fa[x];f;rotate(x),f=fa[x])
if(fa[f]) rotate(check(f)==check(x)?f:x);
root=x;
}
inline void insert(int x) {
if(!root) {root=newnode(x);return ;}
int now=root,f=0;
while(1) {
if(key[now]==x) {cnt[now]++;update(now);update(f);splay(now);return ;}
f=now,now=nd[now][x>key[now]];
if(!now) {now=newnode(x);fa[now]=f;nd[f][x>key[f]]=now;update(f);splay(now);return ;}
}
}
inline int rk(int x) { int now=root,ans=0;
while(1) {
if(x<key[now]) now=nd[now][0];
else {
ans+=siz[nd[now][0]];
if(key[now]==x) return splay(now),ans+1;
ans+=cnt[now]; now=nd[now][1];
}
}
}
inline int kth(int x) { int now=root;
while(1) {
if(nd[now][0]&&x<=siz[nd[now][0]]) now=nd[now][0];
else {
x-=siz[nd[now][0]]+cnt[now];
if(x<=0) return now;
now=nd[now][1];
}
}
}
inline int prenxt(int now) { int wh=check(now);
while(nd[now][wh^1]) now=nd[now][wh^1];
return now;
}
inline void del(int x) {
rk(x);
if(cnt[root]>1) {cnt[root]--;update(root);return ;}
if(!nd[root][0]&&!nd[root][1]) {clear(root);root=0;return ;}
if(!nd[root][0]) {int old=root;root=nd[root][1];fa[root]=0;clear(old);return ;}
if(!nd[root][1]) {int old=root;root=nd[root][0];fa[root]=0;clear(old);return ;}
int old=root;
splay(prenxt(nd[root][0]));
nd[root][1]=nd[old][1];
fa[nd[old][1]]=root;
clear(old);
update(root);
return ;
}
/*--splay_end--*/
int main() {
int n=rd();
for(int i=1;i<=n;i++) { int opt=rd(),x=rd();
switch(opt) {
case 1:insert(x);break;
case 2:del(x);break;
case 3:out(rk(x));break;
case 4:out(key[kth(x)]);break;
case 5:insert(x);out(key[prenxt(nd[root][0])]);del(x);break;
case 6:insert(x);out(key[prenxt(nd[root][1])]);del(x);break;
}
}
return 0;
}

[luogu3369] 普通平衡树(splay模板)的更多相关文章

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

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

  2. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  3. bzoj3224 普通平衡树 splay模板

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

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

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

  5. [luogu3369]普通平衡树(fhq-treap模板)

    解题关键:无旋treap模板. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  6. [luogu3369]普通平衡树(treap模板)

    解题关键:treap模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  7. [bzoj3224]Tyvj 1728 普通平衡树——splay模板

    题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...

  8. P3369 【模板】普通平衡树 (splay 模板)

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

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

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

  10. 文艺平衡树(splay模板)

    题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...

随机推荐

  1. 【ACM-ICPC 2018 南京赛区网络预赛 E】AC Challenge

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个DP 设f[j]表示已经做的题的状态为j的情况下接着选能获得的最大分数. 显然是个倒推. 记忆化搜索一波 dfs(i,j) 表示 ...

  2. 0111MySQL优化的奇技淫巧之STRAIGHT_JOIN

    转自博客http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* F ...

  3. 洛谷 U5737 纸条

    U5737 纸条 题目背景 明明和牛牛是一对要好的朋友,他们经常上课也想讲话,但是他们的班级是全校纪律最好的班级,所以他们只能通过传纸条的方法来沟通.但是他们并不能保证每次传纸条老师都无法看见,所以他 ...

  4. 《UML精粹》第三章 -类图的基本概念

    第三章 类图:基本概念 类图可用来描写叙述系统中各种对象的类型.也可描绘出对象间各种各样的静态关系.此外.类图中也能够秀出类的性质(property)与操作(operation),以及可应用到对象间连 ...

  5. 小米2S电池电量用尽充电无法开机解决方法

    背景:        昨晚睡觉前关机,记得电量还有百分之七八十,但早上起床后,指示灯一直红灯闪烁.按开机键和其它键都没反应! ! 解决方法:         扣下电池,用万能充冲电,略微多冲一会,由于 ...

  6. 深刻理解Nginx之Nginx完整安装

    1.   Nginx安装 1.1预先准备 CentOS系统下,安装Nginx的库包依赖. 安装命令例如以下: sudo yum groupinstall "DevelopmentTools& ...

  7. javaScript实现日历控件

    近期学习js.闲来无事就写了个简单的日历控件.不知道别人是怎么实现的.纯粹自己想法写的, 写的不好 ,但能够起到抛砖引玉的作用. 先来看效果. watermark/2/text/aHR0cDovL2J ...

  8. R语言基础-数组和列表

    数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须 ...

  9. angularjs1-3,$apply,$watch

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Swift EventKit的初学者指南–请求权限

    EventKit为获取和操作用户日历事件和提醒提供了一系列的类.在下面的教程中,我的目标是带领你走出利用EventKit建立一个应用程序的第.我的目标是带领你迈出利用EventKit建立一个应用程序的 ...