【题目链接】
【题目考点】
1. STL map
2. STL pair
pair<T1, T2> make_pair(T1 a, T2 b);
make_pair函数可以将两个量组合成一个pair类型的对象。
【解题思路】
共有
1
0
5
10^5
105个寄包柜,每个寄包柜最多有
1
0
5
10^5
105格子。
如果每个格子都用一个int类型的变量表示,那么需要声明int a[100000][100000]
,共
1
0
10
10^{10}
1010个int类型的变量。内存限制128M,最多保存
128
∗
1024
∗
1024
/
4
≈
3
∗
1
0
7
128*1024*1024/4\approx 3*10^7
128∗1024∗1024/4≈3∗107个int类型的变量,一定会内存超限。
由于超市中的寄包格子总数不会超过
1
0
7
10^7
107,如果我们可以为每个可能的寄包格子设一个int类型的变量来保存该格子中的物品,这就是可行的。
这里需要用到表示映射的STL map。
解法1:每个柜子是一个map对象,使用map数组
我们可以为每个寄包柜设一个map对象,map中的键为格子编号,值为物品。
设map数组map<int, int> locker[100005]
, locker[i]
表示第i个寄包柜,locker[i][j]
表示第i个寄包柜第j个格子中的物品。
由于数据量达到
1
0
5
10^5
105,在主函数内声明会栈溢出,需要将locker声明成全局变量。
解法2:将柜子与格子编号组合成pair对象作为键
由于给定柜子、格子编号后,就能唯一确定一个位置,因此可以将柜子与格子编号合成一个pair类的对象,以这个pair对象作为键,值是物品。这样只需要声明一个map对象:map<pair<int, int>, int> mp;
mp[make_pair(i, j)]
为第i个柜子第j个格子中的物品。
【题解代码】
解法1:每个柜子是一个map对象,使用map数组
#include <bits/stdc++.h>
using namespace std;
#define N 100005
map<int, int> locker[N];//locker[i]:第i个寄包柜,locker[i][j]:第i个寄包柜第j个格子中的物品。
int main()
{
int n, q, t, i, j, k;
cin >> n >> q;
while(q--)
{
cin >> t;
if(t == 1)
{
cin >> i >> j >> k;
locker[i][j] = k;
}
else//t == 2
{
cin >> i >> j;
cout << locker[i][j] << endl;
}
}
return 0;
}
解法2:将柜子与格子编号组合成pair对象作为键
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<pair<int, int>, int> mp;
int n, q, num, i, j, k;
cin >> n >> q;
while(q--)
{
cin >> num;
if(num == 1)
{
cin >> i >> j >> k;
mp[make_pair(i, j)] = k;
}
else
{
cin >> i >> j;
cout << mp[make_pair(i, j)] << endl;
}
}
return 0;
}