这道题的正解应该是bst,但是写bst太复杂了。只好对可怜的STL下手,STL支持迭代器+数字的好像只有string 和 vector,其他迭代器智能++,- -,不能加减数字
例如我们利用multiset < int>::iterator it,it=it+3是非法的,只能是it++,或者it–这些
我们这里使用multiset,multiset和set不同的是mulltiset可以不用去重,但是其序列是从小到大排列好的,非常方便插入一个元素
题目有一个坑,如果没有此元素,则要输出-0x7ffffff,0x7fffffff
例如我们找某一个数的前驱,找不到就要输出-0x7fffffff,同理找某一个数的后继,找不到就输出0x7fffffff
下面是AC代码~~
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int > t;
t.insert(-0x7fffffff);
t.insert(0x7fffffff);
int n,x1,x2,cnt;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x1>>x2;
if(x1==1)
{
cnt=0;
multiset<int>::iterator it=t.lower_bound(x2);//寻找大于等于x2的排名
for(multiset<int>::iterator i=t.begin();i!=it;i++)
{
cnt++;
}
cout<<cnt<<endl;
}
else if(x1==2)
{
cnt=0;
for(auto it=t.begin();it!=t.end();it++)
{
cnt++;
if(cnt==x2+1)
{
cout<<*it<<endl;
break;
}
}
}
else if(x1==3)
{
cout<<*--t.lower_bound(x2)<<endl;//输出小于x2的最大值
}
else if(x1==4)
{
cout<<*t.upper_bound(x2)<<endl;
}
else
{
t.insert(x2);
}
}
}