「LGOJ」寄包柜

题目描述

超市里有 n(n\(\le10^5\))个寄包柜。每个寄包柜格子数量不一,第 i 个寄包柜有 \(a_i(a_i\le10^5)\) 个格子,不过我们并不知道各个 \(a_i\)的值。对于每个寄包柜,格子编号从 1 开始,一直到 \(a_i\)。现在有 \(q(q\le10^5)\)次操作:

  • 1 i j k:在第 i个柜子的第 j 个格子存入物品 \(k(0\le k\le 10^9)\)。当 k=0 时说明清空该格子。
  • 2 i j:查询第 i个柜子的第 j个格子中的物品是什么,保证查询的柜子有存过东西。

已知超市里共计不会超过 \(10^7\) 个寄包格子,\(a_i\)是确定然而未知的,但是保证一定不小于该柜子存物品请求的格子编号的最大值。当然也有可能某些寄包柜中一个格子都没有。

Link

题解

下意识用数组做,但是看了看数据范围,\(10^5*10^5\)必炸空间,开起来有40g.....

所以我们可以用vector(不定长数组)这样就可以节省空间

具体看代码注释

Code

#include <iostream>
#include <cstdio>
#include <vector>//用vector需要声明头文件
using std::vector;//声明std
using namespace std;

#define RE register//循环小优化

int n,q,qaq;
int ii,j,k;

inline void fread(int &x){
    x=0;
    int f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    x*=f;
}//快读qwq

int main(){
    fread(n);
    fread(q);//输入
    vector<vector<int> > f(n+1);//定义vector初始长度为n,+1防止溢出
    for(RE int i=1;i<=q;i++){
        fread(qaq);
        if(qaq==1){
            fread(ii);
            fread(j);
            fread(k);
            if(f[ii].size()<j+1) f[ii].resize(j+1);//如果空间不够就多开一个,直到够
            f[ii][j]=k;
        }else if(qaq==2){
            fread(ii);
            fread(j);
            printf("%d\n",f[ii][j]);//输出
        }
    }
    return 0;
}
posted @ 2021-08-13 11:29  sushitong  阅读(105)  评论(0)    收藏  举报