点个赞吧求求了 QAQ!!!
题目描述 超市有 n 个寄包柜(1 ≤ n ≤ 10⁵),每个寄包柜 i 有 aᵢ 个格子(0 ≤ aᵢ ≤ 10⁵,aᵢ 确定但未知),格子编号从 1 到 aᵢ。需处理 q 次操作(1 ≤ q ≤ 10⁵),操作分为两种: 1 i j k:在第 i 个柜子的第 j 个格子存入物品 k(0 ≤ k ≤ 10⁹);若 k=0,则清空该格子。 2 i j:查询第 i 个柜子的第 j 个格子中的物品(题目保证查询的格子有存过东西)。
补充说明: 所有寄包柜的总格子数不超过 10⁷; aᵢ 不小于该柜子被操作过的最大格子编号(不会操作不存在的格子); 部分寄包柜可能无任何格子(aᵢ=0)。
输入格式
第一行:两个整数 n 和 q,分别表示寄包柜个数和操作次数; 接下来 q 行:每行若干整数,对应一次操作(操作 1 含 4 个整数,操作 2 含 3 个整数)。
输出格式 对每次查询操作(操作 2),输出对应格子的物品值,每个结果单独占一行。
输入输出样例
输入 plaintext 5 4 1 3 10000 118014 1 1 1 1 2 3 10000 2 1 1
输出 plaintext 118014 1
cpp
// 引入C++标准库头文件,满足基础输入输出、容器等功能需求
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<vector> // 引入vector容器头文件,用于存储操作记录
using namespace std;
// 定义结构体st,用于存储单次操作的核心信息
struct st
{
int j; // 寄包柜编号
int g; // 柜子内的格子编号
int k; // 格子中存入的物品值(k=0表示清空)
};
int main()
{
vector<st> v; // 用vector存储所有操作记录,按操作顺序保存
int n,q; // n:寄包柜总数 q:操作次数
cin>>n>>q; // 输入寄包柜数量和操作次数
// 遍历处理每一次操作
for(int i=1;i<=q;i++)
{
int a,b,c,d; // a:操作类型(1=存入/清空,2=查询);b:柜子编号;c:格子编号;d:物品值
cin>>a>>b>>c>>d;
// 操作1:存入/清空物品,记录操作到vector中
if(a==1)
{
st s; // 创建单次操作的结构体对象
s.j=b; // 赋值:操作的柜子编号
s.g=c; // 赋值:操作的格子编号
s.k=d; // 赋值:存入的物品值(0为清空)
v.push_back(s);// 将本次操作添加到vector末尾
}
// 操作2:查询指定柜子+格子的物品值
else
{
int res = 0; // 查询结果默认值(未找到操作时为0,对应清空状态)
// 从后往前遍历操作记录,找最后一次对该柜子+格子的操作(保证结果最新)
for(int idx=v.size()-1;idx>=0;idx--)
{
// 匹配目标柜子和格子编号
if(b == v[idx].j && c == v[idx].g)
{
res = v[idx].k; // 找到最新操作,记录物品值
break; // 找到后立即退出循环,无需继续遍历
}
}
cout << res << endl; // 输出查询结果
}
}
return 0; // 程序正常结束
}