看到dalao使用的sply,打心底佩服,日后我系统学习了sply会再写一篇题解
现在还是直接用STL吧,STL太方便了~
对于这样一个题目,我们直接使用 set就好了~
set自带的函数常用的有10种:
(1)set a 建立一个名字为a、类型为int的集合。
(2)a.insert(b) 在集合中插入一个数b,如果这个数已经存在就什么也不干
(3)a.erase(b) 在集合中删除一个数b,如果这个数不存在就什么也不干
(4)a.erase(l) 在集合中删除地址为l的数
(5)a.end() 返回集合中最后一个数的下一个数的地址
(6)a.find(b) 查询b在集合中的地址,如果这个数不存在就返回a.end()
(7)a.lower_bound(b) 查询b的前驱,就是不小于b的最大的数在集合中的地址,如果是最小的数就返回最大的数的地址
(8)a.upper_bound(b) 查询b的后继,就是大于b的最小的数在集合中的地址,如果是最大的数就返回最大的数的地址
(9)a.empty() 如果集合是空的就返回1,否则就返回0
(10)a.size() 返回集合中元素个数
下面是AC代码~
#include <iostream>
#include <set>
#include <cmath>
using namespace std;
set<int > t;
int main()
{
int n;
cin>>n;
int x1,x2;
t.insert(2000000005);
for(int i=1;i<=n;i++)
{
cin>>x1>>x2;
if(x1==1)
{
if(t.find(x2)!=t.end())
{
cout<<"Already Exist"<<endl;
}
else
{
t.insert(x2);
}
}
else
{
if(t.size()==1)
{
cout<<"Empty"<<endl;
}
else
{
set<int >::iterator it=t.lower_bound(x2);//返回第一个大于等于x2的值
int a=*it;
if(it!=t.begin())
{
it--;
}
int b=*it;
if(abs(a-x2)<abs(b-x2))
{
cout<<a<<endl;
t.erase(a);
}
else
{
cout<<b<<endl;
t.erase(b);
}
}
}
}
return 0;
}