//我这一题是用map做的
//为啥要用map呢?
//首先题上说没有重复的木头,可以考虑map,因为map是去重的
//其次插入和删除木头可以用insert和erase实现
//并且删除木头时还需要最接近的,如果一样近删除最短的
//这种删除木头的操作可以用二分,非常巧的是map是有序的,还可以用二分函数
//所以我就用了map,当然set也是可以的,还有很多做法,但是我这个菜鸡就会一种
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve(){
int n;
cin>>n;
map<int,int>w;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
//放入木材
if(a==1){
if(w.count(b))cout<<"Already Exist"<<endl;
else w[b]=1;
}else{//取出木材
//判断map是否为空
if(w.empty()){
cout<<"Empty"<<endl;
continue;
}
//如果木材存在
if(w.count(b)){
cout<<b<<endl;
w.erase(b);
}else{//木材不存在
auto j=w.lower_bound(b);//二分去找
if(j->first==b){
cout<<b<<endl;
w.erase(b);
}else if(j==w.end()||j==w.begin()){//判断边界条件,以免段错误
if(j==w.end()){
j--;
cout<<j->first<<endl;
}else cout<<j->first<<endl;
w.erase(j->first);
}else{
int v=j->first;
j--;
int vv=j->first;
if(abs(vv-b)<abs(v-b)||abs(vv-b)==abs(v-b)){
cout<<vv<<endl;
w.erase(vv);
}else{
cout<<v<<endl;
w.erase(v);
}
}
}
}
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _;
//cin>>_;
_=1;
while(_--){
solve();
}
return 0;
}
洛谷P5250 【深基17.例5】木材仓库 题解
于 2024-04-23 20:39:30 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)