#include <iostream>
#include<set>
#include<cmath>
using namespace std;
set<int> s;
int main() {
int q;
int op;
cin>>q;
while(q--)
{
cin>>op;
int x;
cin>>x;
if(op==1)
{
if(s.find(x)!=s.end())
{
cout<<"Already Exist\n";
}
else
s.insert(x);
}
else
{
if(!s.empty())
{
auto it=s.lower_bound(x);//>=x的迭代器
//情况一:值比所有都小
if(it==s.begin())
{
cout<<*s.begin()<<'\n';
s.erase(*it);
}
//情况二:值比所有都大:
else if(it==s.end())
{
cout<<*(--it)<<'\n';
s.erase(*it);
it++;//it回复回来;
}//1,2,3;x=5
//情况三:没有卡到边界值的时候:
else{
int num2=abs(*it-x);
int num1=abs(*(--it)-x);
if(num1<=num2){
cout<<*it<<'\n';
s.erase(*it);
}
else
{
cout<<*(++it)<<'\n';
s.erase(*it);
}
}
}
else
cout<<"Empty\n";
}
}
}
这道题还是有一些点值得去学习的。
第一:我确实是没考虑到作为首和尾位的情况;
第二:我也没考虑到如果num1==num2也得输出num1对应的值(人家让输出小的)
第三:好吧我有点笨,upper_bound()和lower_bound()其实差不多来着...
第四:其实set的一些操作我已经忘记了...
这次复习了s.erase(),s.insert(),s.find(x),以及s.empty()啥的;
就这样吧懒得写了。
妹妹我好想你。
还有就是为什么从那以后,我就对你,有点想念?你是一个很好的人,就是这个人吧,态度那叫一个诡异。
反正你也看不到我就随便写了。
你要干啥?前几天给我表白了这几天就感觉很讨厌我似的。你爱咋咋,我不要面子的吗?

京公网安备 11010502036488号