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
アルゴリズム
- \(N, Q\) を読み込む。
- 点数列 \(S_1,\dots,S_N\) を配列 \(S\) として保持する。
- 各問い合わせ \((a_i,b_i)\) について
- 1-indexed で与えられるので 0-indexed に直し、\(a=a_i-1\), \(b=b_i-1\) とする
- \(S[a] > S[b]\) なら
Yes、そうでなければNoを出力用配列に追加する
- 最後に出力用配列を改行で結合してまとめて出力する。
計算量
- 時間計算量: \(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: