1 条题解
-
0
📝 题目大意
有 个数列,第 个数列有 项。给定 个查询,每个查询给出行号 和列号 ,要求输出第 个数列的第 项的值。
💡 解题思路
-
题目分析:,且 ,数据总量在可接受范围内。关键约束在于 的上限,意味着所有元素的总个数不超过 ,因此用二维数组直接存储所有元素是可行的,不会爆内存。
-
算法推导:
- 使用
vector<int> a[N+1]存储每个数列(编号 )。 - 依次读入每个数列的长度 和 个元素,将其
push_back到a[i]中。 - 对于每个查询 ,直接输出
a[s][t-1](注意题目的 是 索引,而 vector 下标从 开始,因此需要减 )。
- 使用
-
边界与细节:
- 输入保证 ,因此不会出现越界访问。
- 元素值最大 ,在
int范围内,无需使用long long。 - 使用
scanf/printf保证在 级别的输入输出量下不会超时。
⏱️ 复杂度分析
- 时间复杂度:。读入所有元素需要 ,回答 个查询每次 。
- 空间复杂度:。所有元素存储在 vector 中。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; vector<int> a[200005]; // a[i] 存储第 i 个数列的所有元素 int n, q, l, s, t, x; int main() { scanf("%d%d", &n, &q); // 读入 N 个数列 for (int i = 1; i <= n; i++) { scanf("%d", &l); // 第 i 个数列的长度 for (int j = 1; j <= l; j++) { scanf("%d", &x); // 读入每个元素 a[i].push_back(x); // 存入对应数列的 vector } } // 处理 Q 个查询 while (q--) { scanf("%d%d", &s, &t); // 查询第 s 个数列的第 t 项 printf("%d\n", a[s][t - 1]); // 下标从 0 开始,需要减 1 } return 0; } -
- 1
信息
- ID
- 641
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者