B - Maintain Multiple Sequences Editorial by KoD
この問題は、二次元配列を扱えるようになるための練習問題です。 AtCoder の問題を解く上で何度も必要となる知識ですので、是非この機会に習得してください。
C++ での解法
まず、二次元の std::vector
を宣言しましょう。
vector<vector<int>> a(n);
これは、「n
個の空の std::vector<int>
からなる二次元の std::vector
を宣言する」ことを表します。a
の各要素は一次元の std::vector
を表します。
次に入力を受け取ります。
for (int i = 0; i < n; ++i) {
int l;
cin >> l;
a[i].resize(l);
for (int j = 0; j < l; ++j) {
cin >> a[i][j];
}
}
はじめ、a[i]
は空の数列であり、\(L_i\) 個の整数を格納するためには、格納するためのスペースを確保する必要があります。 \(4\) 行目で std::vector::resize
を呼び出すことにより、l
個の整数を格納できるようにしています。
なお、\(4\) 行目は次のように書くこともできます。
a[i] = vector<int>(l);
これは「サイズ l
の std::vector<int>
を a[i]
に代入する」ことを表します。
添字は 0-indexed であるので、a[i - 1][j - 1]
で \(i\) 番目の数列の第 \(j\) 項を指します。これを用いると与えられるクエリに答えることができます。
Python での解法
Python にはリストというデータ構造が存在します。二次元のリストを用いて数列を管理しましょう。
a = [[] for _ in range(n)]
これは「空のリスト n
個からなるリストを宣言する」ことを表します。
次に入力を受け取ります。
for i in range(n):
a[i] = list(map(int, input().split()))
これは「一行に与えられた入力を全て受け取り、一つのリストにする」ことを表します。そのため、a[i]
の要素は \((L_i, a_{i, 1}, \dots, a_{i, L_i})\) の合計 \(L_i + 1\) 個です。
よって、a[i - 1][j]
で \(i\) 番目の数列の第 \(j\) 項を指します。これを用いると与えられるクエリに答えることができます。
posted:
last update: