A - 連続する高得点区間 / Consecutive High-Score Segments Editorial by admin
GPT 5.2 High概要
点数が \(K\) 以上の生徒(合格者)が並びの中で「連続している区間」の個数を数え、それが必要な表彰式の回数になります。
考察
表彰は「出席番号が連続している合格者のまとまり」ごとに 1 回で済みます。つまり求めたいのは、配列 \(A_1,\dots,A_N\) を左から見たときに
- 合格(\(A_i \ge K\))が続く部分を 1 つの区間とみなす
- その区間がいくつあるか
という「連続する真(True)の区間数」です。
たとえば \(K=60\)、判定結果(合格なら T)が
F T T F T F T T T なら、連続する T の塊は 3 個なので答えは 3 です。
素朴に「合格者の全ての区間を列挙する」などをすると \(O(N^2)\) になり得て、\(N \le 2\times 10^5\) では間に合いません。
しかしこの問題は、各位置 \(i\) が「新しい合格区間の開始点かどうか」だけ分かれば十分で、1 回の走査で数えられます。
重要な観察は以下です:
- 位置 \(i\) が合格で、かつ直前 \(i-1\) が不合格(または \(i=1\))なら、そこは新しい合格区間の開始
- それ以外(合格が続いているだけ)なら表彰式の回数は増えない
アルゴリズム
ans = 0(表彰式回数)、prev_ok = False(直前が合格だったか)を用意する。- \(i=1\) から \(N\) まで順に点数 \(A_i\) を読む。
ok = (A_i >= K)とする。okが真、かつprev_okが偽なら、ここは「合格区間の開始」なのでans += 1。prev_ok = okに更新して次へ進む。- 最後に
ansを出力する。
これで合格区間の開始回数=合格区間数=表彰式回数を数えられます。
計算量
- 時間計算量: \(O(N)\)(1 回走査するだけ)
- 空間計算量: \(O(1)\)(追加で持つのは定数個の変数のみ)
実装のポイント
「合格で、直前が不合格なら +1」という条件が本質です(境界 \(i=1\) も
prev_ok=Falseで自然に扱える)。入力が大きいので、Python では
sys.stdin.buffer.read()のような高速入力を使うと安全です。合格者が 1 人もいない場合も、この数え方なら自然に
ans=0のままになります。ソースコード
import sys
def main():
it = iter(sys.stdin.buffer.read().split())
N = int(next(it))
K = int(next(it))
ans = 0
prev_ok = False
for _ in range(N):
a = int(next(it))
ok = a >= K
if ok and not prev_ok:
ans += 1
prev_ok = ok
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: