公式
A - 平坦な区間の判定 / Determining Flat Intervals 解説 by admin
gpt-5.3-codex概要
「長さ \(K\) の連続区間で、全ての高さが同じ場所があるか」を判定する問題です。
配列を左から1回見るだけで、同じ値が何個連続しているかを数えれば判定できます。
考察
平坦な区間とは、連続する \(K\) 個がすべて同じということです。
これは言い換えると、「同じ高さが \(K\) 回以上連続する部分があるか」です。
例えば
\(H = [3,3,3,2,2,5]\), \(K=3\) なら、先頭の 3,3,3 が条件を満たすので Yes です。
素朴な方法
各開始位置 \(l\) ごとに、長さ \(K\) の区間 \(H_l \sim H_{l+K-1}\) が全部同じか確認する方法が考えられます。
この場合、区間の数は約 \(N\) 個、各区間の確認に最大 \(K\) 回かかるため、\(O(NK)\) になります。
\(N=2\times10^5\) では間に合わない可能性が高いです。
改善の発想
配列を左から見ながら「現在の連続長」を持てばよいです。
- 前の値と同じなら連続長
runを \(+1\) - 違うなら
run=1にリセット - 途中で
run >= Kになったら即Yes
これなら1回の走査で終わります。
アルゴリズム
- \(N, K\) と配列 \(H\) を読む。
- もし \(K=1\) なら、どの1点区間も平坦なので即
Yes。 run=1で開始。- \(i=1\) から \(N-1\) まで順に見る。
- もし \(H_i = H_{i-1}\) なら
run += 1 - そうでなければ
run = 1 run >= KならYesを出力して終了
- もし \(H_i = H_{i-1}\) なら
- 最後まで見つからなければ
No。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)(実装では配列 \(H\) を保持しているため)
実装のポイント
K==1は必ずYesになるので先に処理すると分かりやすいです。連続長
runの初期値は1(要素1個だけでも同じ値が1個連続している)にします。条件を満たした時点で早期
returnすると無駄な走査を防げます。ソースコード
import sys
def main():
input = sys.stdin.readline
N, K = map(int, input().split())
H = [int(input()) for _ in range(N)]
if K == 1:
print("Yes")
return
run = 1
for i in range(1, N):
if H[i] == H[i - 1]:
run += 1
if run >= K:
print("Yes")
return
else:
run = 1
print("No")
if __name__ == "__main__":
main()
この解説は gpt-5.3-codex によって生成されました。
投稿日時:
最終更新: