Official
A - テストの点数比較 / Comparing Test Scores Editorial by admin
Gemini 3.0 Flash概要
この問題は、\(N\) 人の生徒のテストの点数が与えられたとき、 \(Q\) 個の質問(「生徒 \(a\) の点数は生徒 \(b\) の点数より高いか?」)に対して、それぞれ Yes か No で答える問題です。
考察
この問題を解くために必要なステップは以下の通りです。
- データの格納: 各生徒の点数を、出席番号と紐付けて保存する必要があります。配列(Pythonではリスト)を使えば、出席番号 \(i\) の点数を \(O(1)\) で取り出すことができます。
- インデックスの調整: 問題文では出席番号が \(1\) から \(N\) まで(1-indexed)で与えられますが、プログラム上の配列は通常 \(0\) から始まります(0-indexed)。そのため、出席番号 \(a\) の生徒のデータにアクセスするには、配列の
a-1番目を参照する必要があります。 - 効率的な処理: 制約を見ると \(N\) と \(Q\) が最大で \(10^5\) と大きいため、1つ1つの質問に対して素早く答える必要があります。配列を使えば各質問に \(O(1)\) で答えられるため、全体で \(O(Q)\) となり、十分に間に合います。
- 入出力の高速化: Pythonにおいて、 \(10^5\) 行に及ぶような大量の入出力を
input()やprint()で繰り返すと、入出力自体に時間がかかり実行時間制限(TLE)を招くことがあります。sys.stdin.read().split()やsys.stdout.write()を使うことで、高速に処理できます。
アルゴリズム
- 入力から \(N\) と \(Q\) を読み込みます。
- \(N\) 個の点数をリスト
Hに格納します。 - 各質問 \((a, b)\) に対して、以下の判定を行います。
H[a-1] > H[b-1]であれば、生徒 \(a\) の点数が高いのでYes。- そうでなければ(等しい場合を含む)、
No。
- すべての質問の答えをまとめて出力します。
計算量
- 時間計算量: \(O(N + Q)\)
- 点数の読み込みに \(O(N)\)、各質問の処理に \(O(1) \times Q\) かかるため、全体で \(O(N + Q)\) となります。
- 空間計算量: \(O(N + Q)\)
- 生徒の点数を保存するリストに \(O(N)\)、クエリの回答を一時的に保持する場合に \(O(Q)\) のメモリを使用します。
実装のポイント
比較演算子: 「厳密に高い」という条件なので、
>=(以上)ではなく>(より大きい)を使用します。高速な入出力:
sys.stdin.read().split()を使うと、すべての入力を一度に読み込んで空白や改行で分割したリストを作成できます。回答をリスト
resultsに溜めておき、最後に"\n".join(results)で一気に出力することで、出力回数を減らし高速化しています。ソースコード
import sys
def solve():
# 標準入力からすべてのデータを取得し、空白で分割してリスト化する
# 大量の入力を高速に処理するために sys.stdin.read().split() を使用
input_data = sys.stdin.read().split()
if not input_data:
return
# 生徒の数 N と 質問の数 Q を取得
N = int(input_data[0])
Q = int(input_data[1])
# 各生徒の点数 H_i を取得して整数リストに変換
# 出席番号 i は 1 から始まるため、リスト H のインデックス 0 が出席番号 1 に対応する
H = list(map(int, input_data[2:2+N]))
# 質問データを取得
# 各質問は出席番号 a と b のペアで構成される
queries = input_data[2+N:]
results = []
# 各質問に対してループを回す
for i in range(0, 2 * Q, 2):
# 出席番号 a と b を取得(1-indexed)
a = int(queries[i])
b = int(queries[i+1])
# 生徒 a の点数 H[a-1] と生徒 b の点数 H[b-1] を比較
# a の点数が b の点数より高い場合のみ "Yes"、それ以外は "No"
if H[a-1] > H[b-1]:
results.append("Yes")
else:
results.append("No")
# すべての結果を改行区切りでまとめて出力
sys.stdout.write("\n".join(results) + "\n")
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-preview によって生成されました。
posted:
last update: