Official

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);

これは「サイズ lstd::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: