Official

A - テストの点数比較 / Comparing Test Scores Editorial by admin

GPT 5.2 High

概要

各生徒の点数 \(S_i\) が与えられ、\(Q\) 個の問い合わせごとに「\(S_{a_i} > S_{b_i}\) か?」を判定して Yes/No を出力する問題です。

考察

重要なのは、各質問は「2 人の点数を比べるだけ」であり、点数の更新や複雑な集計は一切ないことです。したがって、あらかじめ点数配列 \(S\) を保持しておけば、問い合わせごとに \(S_{a_i}\)\(S_{b_i}\) を直接比較するだけで答えが出ます。

素朴なアプローチとしても「毎回比較する」以外にやることがなく、これ自体が最適です(\(Q\) 回の質問に答えるには最低でも \(Q\) 回の出力が必要)。
ただし、\(N, Q \le 10^5\) なので、Python で input()\(Q\) 回呼ぶなど遅い入出力をすると TLE になりやすい点には注意が必要です。そこで高速入出力(まとめて読み込み・まとめて出力)を使うのが安全です。

また、問題文には \(a_i = b_i\) のケースもあると明記されていますが、このときは必ず \(S_{a_i} > S_{b_i}\) は偽(同じ値)なので No になります。コード側で特別扱いは不要で、比較演算 > がそのまま正しく処理します。

例: - \(S=[70,80,80]\) のとき、\((a,b)=(2,3)\) なら \(80>80\) は成り立たないので No - \((a,b)=(2,1)\) なら \(80>70\) なので Yes

アルゴリズム

  1. \(N, Q\) を読み込む。
  2. 点数列 \(S_1,\dots,S_N\) を配列 \(S\) として保持する。
  3. 各問い合わせ \((a_i,b_i)\) について
    • 1-indexed で与えられるので 0-indexed に直し、\(a=a_i-1\), \(b=b_i-1\) とする
    • \(S[a] > S[b]\) なら Yes、そうでなければ No を出力用配列に追加する
  4. 最後に出力用配列を改行で結合してまとめて出力する。

計算量

  • 時間計算量: \(O(N+Q)\)(点数の読み込みが \(N\)、各質問の処理が \(Q\)
  • 空間計算量: \(O(N+Q)\)(点数配列が \(N\)、出力を溜める分が最大 \(Q\)

実装のポイント

  • 入出力を高速化sys.stdin.buffer.read().split() でまとめて入力を読み、"\n".join(...) でまとめて出力すると安定して高速です。

  • 添字に注意:入力の出席番号は 1-indexed なので、配列アクセス前に必ず -1 します。

  • 条件は厳密不等号:問題は「厳密に高い」なので >= ではなく > を使います。

    ソースコード

import sys

def main():
    data = sys.stdin.buffer.read().split()
    it = iter(data)
    N = int(next(it))
    Q = int(next(it))
    H = [int(next(it)) for _ in range(N)]
    out_lines = []
    for _ in range(Q):
        a = int(next(it)) - 1
        b = int(next(it)) - 1
        out_lines.append("Yes" if H[a] > H[b] else "No")
    sys.stdout.write("\n".join(out_lines))

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: