公式

B - 果樹園の収穫区間 / Harvest Interval in the Orchard 解説 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)です。

アルゴリズム

  1. 変数 cur を「現在連続して条件を満たしている長さ」、best を「その最大値」とする。
  2. 配列を左から順に見ていく。
    • もし \(L \le x \le R\) なら cur += 1(連続が伸びる)
    • そうでなければ cur = 0(連続が途切れるのでリセット)
  3. 各ステップで best = max(best, cur) を更新する。
  4. 最終的な 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 によって生成されました。

投稿日時:
最終更新: