Official
B - 果樹園の収穫区間 / Harvest Interval in the Orchard Editorial 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 となります。
アルゴリズム
- 変数
max_lenでこれまでの最大の長さを記録します。 - 変数
current_lenで現在の連続した有効区間の長さを記録します。 - 左から右へ一つずつ要素を見て、以下のように処理します:
- もし \(L \leq T_i \leq R\) なら
current_lenを 1 増やす- さらに
current_len > max_lenなら更新
- さらに
- そうでない場合、
current_lenを 0 に戻す
- もし \(L \leq T_i \leq R\) なら
- 最後に
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 によって生成されました。
posted:
last update: