P3613 【深基15.例2】寄包柜(map解法)

    科技2023-09-30  77

    题目描述 超市里有 n(n≤10^5) 个寄包柜。每个寄包柜格子数量不一,第 i 个寄包柜有 ai (ai ≤10 ^5) 个格子,不过我们并不知道各个 ai的值。对于每个寄包柜,格子编号从 1 开始,一直到 ai 。现在有 q(q≤10 ^5) 次操作: 1 i j k:在第 ii个柜子的第 j 个格子存入物品 k(0≤k≤10 ^9)。当 k=0 时说明清空该格子。 2 i j:查询第 i个柜子的第 j个格子中的物品是什么,保证查询的柜子有存过东西。 已知超市里共计不会超过 10^7个寄包格子,ai是确定然而未知的,但是保证一定不小于该柜子存物品请求的格子编号的最大值。当然也有可能某些寄包柜中一个格子都没有。 输入格式 第一行 2 个整数 n 和 q,寄包柜个数和询问次数。 接下来 q 个整数,表示一次操作。 输出格式 对于查询操作时,输出答案。 输入输出样例 输入

    5 4 1 3 10000 114514 1 1 1 1 2 3 10000 2 1 1

    输出

    114514 1

    思路: 首先我们肯定直接数组暴力,会超时。可以用STL中的Map来进行数据离散化,时间复杂度log(N)。直接使用map[i][j]来表示第 i 个柜子的第 j 个物品存放的东西(0表示无东西存放)。

    map<int,int> a[100005];//建立二维映射

    或者

    map<int,map<int,int> > a;//建立二维映射

    上代码

    #include <bits/stdc++.h> using namespace std; map<int,int> a[100005];//建立二维映射 int main() { int n,q; int p,i,j,k; cin >> n >> q; while (q--) { cin >> p >> i >> j; if (p == 1) {//存入 cin >> k; a[i][j] = k; } else cout << a[i][j] << endl;// 查询 } return 0; }
    Processed: 0.015, SQL: 8