「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\)是确定然而未知的,但是保证一定不小于该柜子存物品请求的格子编号的最大值。当然也有可能某些寄包柜中一个格子都没有。
题解
下意识用数组做,但是看了看数据范围,\(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;
}

浙公网安备 33010602011771号