Official
B - プログラミングコンテストの順位表 / Scoreboard of a Programming Contest Editorial by admin Editorial for printing
Qwen3-Coder-480B概要
各参加者のスコアとレーティングに基づいて、指定されたルールに従って順位を決定し、上位から参加者番号を出力する問題です。
考察
この問題では、各参加者に以下の3つの情報があります:
- 獲得スコア \(B_i\)
- レーティング \(A_i\)
- 参加者番号 \(i\)
順位の決め方は以下の通りです:
- スコアが高い順(降順)
- スコアが同じならレーティングが高い順(降順)
- それも同じなら参加者番号が小さい順(昇順)
したがって、これらの情報を一つのタプルにしてソートすることで順位を決定できます。
素朴な方法として、毎回最大値を探すような処理を行うと、最悪ケースで \(O(N^2)\) となり、制約 \(N \leq 2 \times 10^5\) ではTLEしてしまいます。そこで、一度に全体をソートする方法を考えます。
Python では sort() 関数に比較キーを指定できるので、この3つの条件を適切に設定してソートするのが効率的です。
具体的には、(B_i, A_i, i) のタプルを以下のようにソートします:
- 第一キー:\(B_i\) (降順 →
-B_i) - 第二キー:\(A_i\) (降順 →
-A_i) - 第三キー:\(i\) (昇順)
このようにキーを設定することで、問題の順位ルールに沿ったソートが可能です。
アルゴリズム
- 各参加者について
(B_i, A_i, i)のタプルを作成し、リストに格納する。 - このリストを以下のキーでソートする:
-B_i(スコアの降順)-A_i(レーティングの降順)i(番号の昇順)
- ソートされた順に参加者番号を出力する。
計算量
- 時間計算量: \(O(N \log N)\)(ソートによる)
- 空間計算量: \(O(N)\)(参加者情報の保存)
実装のポイント
- 入力を高速に読み込むために
sys.stdin.readを使用している。 - ソートキーを
(-B, -A, i)のように設定することで、複数条件を一度に扱える。 - タプルの要素を取り出す際、アンダースコア
_を使って無視する変数を明示的に表現すると可読性が上がる。
## ソースコード
```python
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
participants = []
index = 1
for i in range(N):
A = int(data[index])
B = int(data[index+1])
participants.append((B, A, i+1))
index += 2
participants.sort(key=lambda x: (-x[0], -x[1], x[2]))
for _, _, num in participants:
print(num)
この解説は qwen3-coder-480b によって生成されました。
posted:
last update: