w3-2 寄包柜

发布时间 2023-04-19 22:32:39作者: lijunjie03

第一种方法:数组10^5*10^5 超范围

第二种方法:vector(mle)

//较麻烦,并且通过不了hack,需要手动搜索查询
#include <iostream>
#include <vector>
using namespace std;
int n,p,judge,num1,num2,k;
struct num{//格子
    int index,k;//第index个格子,放的是k
};
struct cupboard{
    vector<num>b;//柜子的格子,非连续
};
int main() {
    cin>>n>>p;
    cupboard a[n+1];
    for(int i=0;i<p;++i){
        cin>>judge;//操作模式
        if(judge==1){
            cin>>num1>>num2>>k;//第几个柜子第几个格子放了几
            if(!k){//清数
                for(int j=0;j<a[num1].b.size();++j){//遍历第num1个柜子的格子
                    if(a[num1].b[j].index==num2){//如果已经有该数字,清除该格子
                        a[num1].b.erase(a[num1].b.begin()+j);
                    }
                }
            }
            else{//放数
                num tmp;
                tmp.index=num2;
                tmp.k=k;
                a[num1].b.push_back(tmp);
            }
        }
        else{
            cin>>num1>>num2;
            for(int j=0;j<a[num1].b.size();++j){
                if(a[num1].b[j].index==num2){
                    cout<<a[num1].b[j].k<<endl;
                }
            }
        }
    }
    return 0;
}

需要0(n)去搜索有没有这个k

第三种方法:map

    #include <iostream>
    #include <map>
    using namespace std;
    int n,p,judge,num1,num2,k;

    int main() {
        cin>>n>>p;
        map<pair<int,int>,int>a;//运用pair可用o(1)时间找出第几个柜子的第几个格子的k
        for(int i=0;i<p;++i){
            cin>>judge;
            if(judge==1){
                cin>>num1>>num2>>k;
                if(!k){
                    a.erase({num1,num2});
                }
                else{
                    a[{num1,num2}]=k;
                }
            }
            else{
                cin>>num1>>num2;
                cout<<a[{num1,num2}]<<endl;
            }
        }
        return 0;
    }