题目描述
您需要写一种数据结构,来维护一些数( 都是 10^9109 以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数 qq 不超过 10^4104:
- 查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1。若有多个相同的数,应输出最小的排名)。
- 查询排名为 xx 的数。
- 求 xx 的前驱(前驱定义为小于 xx,且最大的数)。若未找到则输出 -2147483647−2147483647。
- 求 xx 的后继(后继定义为大于 xx,且最小的数)。若未找到则输出 21474836472147483647。
- 插入一个数 xx。
输入格式
无
输出格式
无
输入输出样例
输入 #1
7
5 1
5 3
5 5
1 3
2 2
3 3
4 3
输出 #1
2
3
1
5
使用mulitset,mulitset是什么?
multiset是C++ STL里的一种容器。
multiset有什么性质?
- 里面的元素按顺序排列,默认升序。
- 不去重(这点和set是不同的)。
常用函数
multiset<int>q;
//定义一个multiset,尖括号里写类型
//如果是自定义类型,需要重载小于号
q.insert(x);
//插入一个数 x
q.clear();
//清空
q.erase(x);
//删除容器中的所有值为 x 的数
q.erase(it);
//删除容器中迭代器it指向的元素
q.empty();
//返回bool值,如果容器为空返回true,否则返回false
q.size()
//返回元素个数
q.begin();
//返回首个元素的迭代器
q.end();
//返回最后一个元素的下一个位置的迭代器
q.count(x);
//返回容器中 x 的个数
q.find(x);
//返回容器中第一个x的位置(迭代器),如果没有就返回q.end()
q.lower_bound(x);
//返回容器中第一个大于等于x的数的迭代器
q.upper_bound(x);
//返回容器中第一个大于x的数的迭代器
AC代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
int main(){
multiset<int>a;
a.insert(-2147483647);
a.insert(2147483647);
int n;
scanf("%d",&n);
multiset<int>::iterator it;
int num=0;
for(int i=0;i<n;i++){
int q,x;
scanf("%d%d",&q,&x);
if(q==1){
int num=0;
it=lower_bound(a.begin(),a.end(),x);
for(multiset<int>::iterator j=a.begin();j!=a.end();j++){
if(it!=j) num++;
else break;
}
printf("%d\n",num);
}
else if(q==2){
int num=-1;
for(multiset<int>::iterator j=a.begin();j!=a.end();j++){
num++;
if(x==num) printf("%d\n",*j);
}
}
else if(q==3){
it=lower_bound(a.begin(),a.end(),x);
multiset<int>::iterator flat;
for(multiset<int>::iterator j=a.begin();j!=a.end();j++){
if(it!=j) flat=j;
else break;
}
printf("%d\n",*flat);
}
else if(q==4){
it=upper_bound(a.begin(),a.end(),x);
printf("%d\n",*it);
}
else if(q==5){
a.insert(x);
}
}
}