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

数据范围:操作数$≤10^5$,$x≤10^9$。

这一题用平衡树做的方法是显然的,然而平衡树太长太慢,我们考虑写一个优美一点的算法。

首先先离散化所有读入的数(别离散化操作4!!!!)

然后,插入和删除操作显然(直接在离散化后的x处,赋值+1或者-1即可)

查询某个数的排名也是显然的。

考虑查询排名为$x$如何高速完成,此处不妨设$x$为正整数。

我们求一个最小的$p$,使得$2^p≥cnt$,其中$cnt$为树状数组的长度。

设当前访问到的点为$id$(初始为$0$)

我们每次查询$a[id+2^p]$上的值是否小于$x$,如果是$x$,那么$id+=2^p$,然后$x-=a[id]$。

然后p--即可。

最后输出$id+1$即是第$k$大的数。

求前驱和后继:先求出给出的数是第几大的,然后$+1$或$-1$即可。

代码奇短

 #include<bits/stdc++.h>
#define M 200000
#define lowbit(x) ((x)&(-x))
using namespace std;
int a[M]={},c[M]={},n,cnt=,m;
int op[M]={},b[M]={};
void add(int x,int k){for(;x<=n;x+=lowbit(x)) a[x]+=k;}
int sum(int x){int k=;for(;x;x-=lowbit(x)) k+=a[x]; return k;}
int getkth(int k){
int id=;
for(int i=n;i;i>>=){
if(k>a[id+i])
k-=a[id+i],id+=i;
}
return id+;
}
int main(){
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",op+i,b+i);
if(op[i]!=) c[++cnt]=b[i];
}
sort(c+,c+cnt+);
for(int i=;i<=m;i++)
if(op[i]!=) b[i]=lower_bound(c+,c+cnt+,b[i])-c;
for(n=;n<=cnt;n<<=);
for(int i=;i<=m;i++){
if(op[i]==) add(b[i],);
if(op[i]==) add(b[i],-);
if(op[i]==) printf("%d\n",sum(b[i]-)+);
if(op[i]==) printf("%d\n",c[getkth(b[i])]);
if(op[i]==) printf("%d\n",c[getkth(sum(b[i]-))]);
if(op[i]==) printf("%d\n",c[getkth(sum(b[i])+)]);
}
}

最新文章

  1. 图片切换小demo
  2. 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感
  3. SVG 动画实现弹性的页面元素效果
  4. as3.0:文字 效果
  5. Uncode-Schedule首页、文档和下载 - 分布式任务调度组件 - 开源中国社区
  6. Python3基础 用list()查看filter()返回的对象
  7. mysql 关于表与字段的增删改查操作
  8. [Hadoop]Hadoop章3 NameNode的ZKFC机制
  9. Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)
  10. 1)requests模块
  11. 编译安装和apt安装Nginx1.14.0
  12. Redis JdkSerializationRedisSerializer,stringRedisSerializer,ProtoBuf 体积,性能简单比较.
  13. C# 对WinForm应用程序的App.config的使用及加密
  14. 一步一步pwn路由器之uClibc中malloc&amp;&amp;free分析
  15. java 常量 因为常量不依赖对象 所以一般都会将常量设置为 类属性
  16. Android音视频学习第7章:使用OpenSL ES进行音频解码
  17. anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
  18. Hebernate -- 映射继承关系
  19. 「BZOJ 2434」「NOI 2011」阿狸的打字机「AC自动机」
  20. Git Reference

热门文章

  1. 关于多系统跨浏览器 BrowserStack 的使用
  2. 2018.10.21 codeforces1071A. Cram Time(贪心构造)
  3. 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)
  4. 39 What Determines the Kind of Person You Are ?是什么决定了你是哪种内型的人 ?
  5. 编写属于自己的linux命令
  6. 顺序表[A+B-&gt;C]
  7. Swift:在Safari中打开App
  8. pytest 入门及运行
  9. Java核心编程快速学习(转载)
  10. c# .net中的简单Job