洛谷:P5250 【深基17.例5】木材仓库
然而我的解法没用到树
想法:用set维护,因为set是个自动有序的容器,想法如果是1的话直接insert就行了,如果是2的话就得判断了,(1)判断是否存在该元素这种情况直接删除就行了 (2)如果不存在的话就把这个元素插入进去,方便找比这个元素大和比这个元素小的数,然后插进去后,得判断有没有比它大的数,如果没有,则直接输出,比它小的那个元素,再判断有没有比它小的元素,如果没有,直接输出,比它大的元素,然后如果比它大的元素和比它小的元素都存在的话,再次进行判断。注意插入后记得删除即可
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int t,k;
set<int> st;
for(int i=1;i<=n;i++)
{
cin>>t>>k;
if(t==1)
{
if(st.find(k)!=st.end())
{
cout<<"Already Exist"<<endl;
}
else{
st.insert(k);
}
}
else
{
if(st.empty())
cout<<"Empty"<<endl;
else{
if(st.find(k)!=st.end()){
cout<<k<<endl;
st.erase(k);
}
else{
st.insert(k);
set<int>::iterator it1,it2,it3;
it1=st.find(k);
it3=it1;
it2=it1;
it2++;it3--; //it2值向比k大的那个数,it3指向比k小的那个数
//得判断是否存在那么一个数
if(it2==st.end()){
cout<<*it3<<endl;
st.erase(*it3);
}
else if(it1==st.begin()){
cout<<*it2<<endl;
st.erase(*it2);
}else{
int k1=*it2-k;
int k2=k-*it3;
if(k1<k2){
cout<<*it2<<endl;
st.erase(*it2);
}else{
cout<<*it3<<endl;
st.erase(*it3);
}
}
st.erase(*it1);
}
}
}
}
return 0;
}