公式

B - 果樹園の収穫区間 / Harvest Interval in the Orchard 解説 by admin

Qwen3-Coder-480B

概要

与えられた数列から、連続した部分列で値が \(L\) 以上 \(R\) 以下である最長の長さを求めます。

考察

この問題では、各区間 \([l, r]\) が条件「すべての要素が \(L\) 以上 \(R\) 以下」を満たすかどうかを判定する必要があります。
素朴な方法として、すべての区間を全探索する方法(二重ループ)が考えられますが、これは \(O(N^2)\) の計算量となり、制約 \(N \leq 2 \times 10^5\) に対しては時間内に処理できません(TLE)。

重要な観察は、「条件を満たす区間は連続している必要がある」という点です。つまり、左から順番に見ていきながら、現在の連続した有効な区間の長さを保持していけば、最大の長さを効率的に求めることができます。
具体的には、現在の要素 \(T_i\) が範囲内であればカウンタを増やし、範囲外であればリセットすれば良いです。

例えば、入力が

N=6, L=3, R=5  
T = [2, 3, 4, 5, 6, 4]

のとき、条件を満たす区間は
- \([2, 3, 4, 5]\) → 長さ 4(開始位置1、終了位置3)
- \([4]\) → 長さ 1(開始位置5)
となり、答えは 4 となります。

アルゴリズム

  1. 変数 max_len でこれまでの最大の長さを記録します。
  2. 変数 current_len で現在の連続した有効区間の長さを記録します。
  3. 左から右へ一つずつ要素を見て、以下のように処理します:
    • もし \(L \leq T_i \leq R\) なら current_len を 1 増やす
      • さらに current_len > max_len なら更新
    • そうでない場合、current_len を 0 に戻す
  4. 最後に max_len を出力

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\) (入力の配列を除く)

実装のポイント

  • 入力を高速に読み込むために sys.stdin.read を使用しています。
  • 条件判定は単純な不等式 \(L \leq T_i \leq R\) で行います。
  • 区間が一つもない場合、max_len は初期値の 0 のままとなるので、特に処理は不要です。
## ソースコード

```python
def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    N = int(data[0])
    L = int(data[1])
    R = int(data[2])
    T = list(map(int, data[3:]))

    max_len = 0
    current_len = 0

    for i in range(N):
        if L <= T[i] <= R:
            current_len += 1
            if current_len > max_len:
                max_len = current_len
        else:
            current_len = 0

    print(max_len)

if __name__ == "__main__":
    main()

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: