【洛谷P5250】木材仓库

今天还是在学map!

先来看一下题面

P5250 【深基17.例5】木材仓库

题目描述

博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:

  • 进货,格式1 Length:在仓库中放入一根长度为 Length(不超过 \(10^9\)) 的木材。如果已经有相同长度的木材那么输出Already Exist
  • 出货,格式2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty

输入格式

输出格式

输入输出样例 #1

输入 #1

7
1 1
1 5
1 3
2 3
2 3
2 3
2 3

输出 #1

3
1
5
Empty

解法&&个人思考

这道题考察了一个随机插入删除的过程
又因为没有前后的顺序关系
而且用数组的话\(10^9\)会被卡
所以考虑万能的map!
下面我们先看代码 然后我会一一道来

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n,opt,l;
map<int,int>q;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&opt,&l);
        if(opt==1){
            if(q.count(l)) cout<<"Already Exist"<<endl;
            else q[l]=1;
        }
        if(opt==2){
            if(q.empty()) cout<<"Empty"<<endl;
            else if(q.count(l)){
                q.erase(l);
                cout<<l<<endl;
            }
            else{
                q[l]=1;
                auto st=q.find(l);
                auto st_2=st;
                st++;
                if(st_2==q.begin()){
                    cout<<st->first<<endl;
                    q.erase(st);
                }
                else if(st==q.end()){
                    cout<<(--st_2)->first<<endl;
                    q.erase(st_2);
                }
                else if(l-(--st_2)->first>st->first-l){
                    cout<<st->first<<endl;
                    q.erase(st);
                }
                else{
                    cout<<st_2->first<<endl;
                    q.erase(st_2);
                }
                q.erase(l);
            }
        }
    }
    system("pause");
    return 0;
}

map的相关函数我们在上期已经给出了
现在我们要介绍一个map的重要性质:
它是自动排序的!WOW!(曼波!)
那么要确定离它最近的值 就是附近的两个值了,好方便!
耶!
哦还有 auto是判断变量类型的声明函数 它会自动判断适合的变量类型呦
这里我们得到的是指针 然后例如st->first也就是st指针指向的map类型的第一变量
我们的思路是 假插入一个元素l 然后除掉l的相邻元素 最后删去l 这样就大功告成啦~
这题用平衡树应该也能做 但是还是要训练一下STL的嘛

posted @ 2025-02-16 16:22  elainafan  阅读(58)  评论(0)    收藏  举报