菜鸟生成记(50)
这题数据不是很大vector就能水过,map理论上应该是更快一些;
但是不太好写(map理解了,但是还没完全理解0_0);
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int find_lower(int st,int ed,int num,vector<int> &a)
{
if(st>ed)
{
if(st==0)
return -1;
else
return st-1;
}
int mid=(st+ed)/2;
if(a[mid]<=num)
find_lower(mid+1,ed,num,a);
else if(a[mid]>num)
find_lower(st,mid-1,num,a);
}
int find_upper(int st,int ed,int num,vector<int> &a)
{
if(st>ed)
{
if(ed==a.size()-1)
return -1;
else
return ed+1;
}
int mid=(st+ed)/2;
if(a[mid]<num)
find_upper(mid+1,ed,num,a);
else if(a[mid]>=num)
find_upper(st,mid-1,num,a);
}
int main()
{
int n;
cin>>n;
int lower,upper;
vector<int>a;
vector<int>::iterator it,j,k,s;
for(int i=0;i<n;i++)
{
int x,num;
cin>>x>>num;
switch(x)
{
case 1://插入 num
it=find(a.begin(),a.end(),num);
if(it!=a.end())
{
cout<<"Already Exist"<<endl;
}
else
{
a.insert(lower_bound(a.begin(),a.end(),num),num);
}
break;
case 2://取出 num
it=find(a.begin(),a.end(),num);
if(a.empty())
{
cout<<"Empty"<<endl;
}
else
{
if(it!=a.end())
{
cout<<*it<<endl;
a.erase(it);
}
else if(it==a.end())
{
lower=find_lower(0,a.size()-1,num,a);
upper=find_upper(0,a.size()-1,num,a);
if(upper==-1)
{
cout<<a[lower]<<endl;
a.erase(a.begin()+lower);
}
else if(lower==-1)
{
cout<<a[upper]<<endl;
a.erase(a.begin()+upper);
}
else
{
int le=(num-a[lower])<=(a[upper]-num)?lower:upper;
cout<<a[le]<<endl;
a.erase(a.begin()+le);
}
}
}
break;
}
}
return 0;
}