您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
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 ;
}

最新文章

  1. httpie 取代 curl
  2. 查看SQL Server被锁的表以及如何解锁
  3. ASP.NET MVC5 Filter重定向问题
  4. Python time datetime常用时间处理方法
  5. FlashPaper 使用经验之谈
  6. ADO.NET 快速入门(十三):使用 OLE DB 检索数据
  7. PHP json_encode中日语问题
  8. (转)smarty实现多级分类的方法
  9. 激动啊,终于诞生了,编译了属于俺自己的 JDK
  10. vs2008试用版的评估期已经结束解决办法
  11. mvc的IIS 配置问题 runAllManagedModulesForAllRequests 与 HtmlFileHandler
  12. IntelliJ IDEA(八) :git的使用
  13. Github速度慢的解决方法
  14. centos安装图形界面
  15. java自动化学习笔记
  16. 编程菜鸟的日记-初学尝试编程-编写函数实现strcat
  17. 从零开始部署一个 Laravel 站点
  18. Java中的内部类————以及jdk1.8的lambda表达式
  19. 常用的 Linux iptables 规则
  20. 树莓派命令行配置连接wifi

热门文章

  1. BZOJ4551 - [TJOI2016]树
  2. Sencha Touch 2 实现跨域访问
  3. SpringBoot自定义Filter
  4. 【CF766D】Mahmoud and a Dictionary(并查集)
  5. msp430项目编程000
  6. msp430入门编程44
  7. msp430入门编程24
  8. D. Spongebob and Squares--cf599D(数学)
  9. Javascript标准事件模型
  10. ArcGIS engine中Display类库——Display