【bzoj3224】【Tyvj 1728】 普通平衡树 树状数组
2024-09-22 06:07:13
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
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])+)]);
}
}
最新文章
- 图片切换小demo
- 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感
- SVG 动画实现弹性的页面元素效果
- as3.0:文字 效果
- Uncode-Schedule首页、文档和下载 - 分布式任务调度组件 - 开源中国社区
- Python3基础 用list()查看filter()返回的对象
- mysql 关于表与字段的增删改查操作
- [Hadoop]Hadoop章3 NameNode的ZKFC机制
- Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)
- 1)requests模块
- 编译安装和apt安装Nginx1.14.0
- Redis JdkSerializationRedisSerializer,stringRedisSerializer,ProtoBuf 体积,性能简单比较.
- C# 对WinForm应用程序的App.config的使用及加密
- 一步一步pwn路由器之uClibc中malloc&;&;free分析
- java 常量 因为常量不依赖对象 所以一般都会将常量设置为 类属性
- Android音视频学习第7章:使用OpenSL ES进行音频解码
- anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
- Hebernate -- 映射继承关系
- 「BZOJ 2434」「NOI 2011」阿狸的打字机「AC自动机」
- Git Reference
热门文章
- 关于多系统跨浏览器 BrowserStack 的使用
- 2018.10.21 codeforces1071A. Cram Time(贪心构造)
- 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)
- 39 What Determines the Kind of Person You Are ?是什么决定了你是哪种内型的人 ?
- 编写属于自己的linux命令
- 顺序表[A+B->;C]
- Swift:在Safari中打开App
- pytest 入门及运行
- Java核心编程快速学习(转载)
- c# .net中的简单Job