B - 果樹園の収穫区間 / Harvest Interval in the Orchard Editorial by admin
GPT 5.2 High概要
各木の糖度が \([L, R]\) に収まるような 連続区間のうち、最長の長さを求める問題です。
考察
条件「区間内のすべての \(T_i\) が \(L \le T_i \le R\)」を満たすためには、区間中に 1つでも範囲外の値があればその区間は不適になります。
つまり、配列を見たときに
- 「\(L \le T_i \le R\) を満たす要素が連続している部分」
その 連続部分の最大長を求めればよい、と言い換えられます。
素朴に全ての \([l,r]\) を試すと区間は \(O(N^2)\) 個あり、各区間の判定まで含めるとさらに重くなります。\(N \le 2 \times 10^5\) なので \(O(N^2)\) は確実に間に合いません(TLE)。
そこで、「今どこまで連続で条件を満たしているか」だけを持ちながら左から1回走査すれば、最長長さを効率よく求められます。
例:\(T = [3, 5, 2, 4, 6]\), \(L=3\), \(R=5\) のとき
条件を満たす/満たさないは [○, ○, ×, ○, ×] なので、連続する○の最大は長さ2(最初の 3,5)です。
アルゴリズム
- 変数
curを「現在連続して条件を満たしている長さ」、bestを「その最大値」とする。 - 配列を左から順に見ていく。
- もし \(L \le x \le R\) なら
cur += 1(連続が伸びる) - そうでなければ
cur = 0(連続が途切れるのでリセット)
- もし \(L \le x \le R\) なら
- 各ステップで
best = max(best, cur)を更新する。 - 最終的な
bestが答え(条件を満たす区間がなければ自然に 0 のまま)。
この方法は「条件を満たす要素の連続区間(ブロック)」の長さを数え、その最大を取っているだけです。
計算量
- 時間計算量: \(O(N)\)(1回の走査)
- 空間計算量: \(O(1)\)(入力配列以外は定数個の変数)
実装のポイント
範囲判定は
L <= x <= Rのようにまとめて書ける(Pythonの比較連鎖)。範囲外が出たら「その位置を含む区間は不可能」なので、連続長
curを必ず 0 に戻す。入力が大きいので
sys.stdin.buffer.read()でまとめて読み取ると高速で安全です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
N, L, R = data[0], data[1], data[2]
T = data[3:3+N]
best = 0
cur = 0
for x in T:
if L <= x <= R:
cur += 1
if cur > best:
best = cur
else:
cur = 0
print(best)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: