题目链接:P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态
题目难度:普及/提高
解题心得:本题借鉴了大佬的做法(因为没想多好的处理方法~~),本题可以用map,对于操作1,存的话直接另key的值为1即可,而对于不存在又要取出长度相近的,本人的方法是利用map的指针操作,先“假装”存一下该不存在的木头,然后指针定位该木头的位置,于是it++就得到了比它长的下一根木头的位置,it--就得到了比它短的下一根木头的位置,两者比较一下,然后取出长度相近的即可,最后记得erase之前“假装”存的那根不存在的木头。
#include<bits/stdc++.h>
using namespace std;
#define _for(i,a,b) for(int i=(a); i<(b); i++)
#define _rep(i,a,b) for(int i=(a); i<=(b); i++)
typedef long long ll;
const int N = 1e5 + 10;
map<int,int> mp;
int n, op, l;
int read() // 快读函数
{
int k = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
k = k * 10 + ch - '0';
ch = getchar();
}
return k * f;
}
int main()
{
n = read();
while (n--)
{
op = read();
l = read();
if (op == 1) // 插入操作
{
if (mp.count(l))
puts("Already Exist");
else
mp[l] = 1;
}
else // 删除或查找操作
{
if (mp.empty()) puts("Empty");
else if (mp.count(l))
{
mp.erase(l);
cout<<l<<'\n';
}
else
{
mp[l] = 1; // 假装存下木头
auto it = mp.find(l);
auto it1 = it;
it++; // it 指向比 l 大的元素
// 几种特判
if (it1 == mp.begin())// 没有比它短的
{
cout << it->first << '\n';
mp.erase(it);
}
// 长度比较
else if (it == mp.end())// 没有比它长的
{
cout << (--it1)->first <<'\n';
mp.erase(it1);
}
else
{
auto it2 = --it1;
if (l - it2->first > it->first - l)
{
cout << it->first << '\n';
mp.erase(it);
}
else
{
cout << it2->first << '\n';
mp.erase(it2);
}
}
mp.erase(l); // 删掉假装存的木头
}
}
}
return 0;
}