Official
E - 気温の安定した期間 / Period of Stable Temperature Editorial
by
E - 気温の安定した期間 / Period of Stable Temperature Editorial
by
sounansya
まず、日数が \(K\) 日以上という条件を取り除いた問題を考えます。
この問題は尺取り法で解くことができます。
また、問題の答えは日数が \(K\) 日以上という条件を取り除いた問題の答えが \(K\) 以上であればその値が、\(K\) 未満であれば -1 が答えになります。
尺取りの内部で区間の最大値・最小値を求める方法はいくつかありますが、セグメント木を用いることで楽に実装することができます。この場合の計算量は \(O(N\log N)\) です。
Monotonic Stack を用いることで \(O(N)\) で解くこともできます。
import sys
from atcoder.segtree import SegTree
INF = 10**9
def op_min(x, y):
return min(x, y)
def e_min():
return INF
def op_max(x, y):
return max(x, y)
def e_max():
return -INF
input = sys.stdin.readline
n, k, d = map(int, input().split())
a = list(map(int, input().split()))
seg_min = SegTree(op_min, e_min(), a)
seg_max = SegTree(op_max, e_max(), a)
ans = 0
r = 0
for l in range(n):
while r != n and seg_max.prod(l, r + 1) - seg_min.prod(l, r + 1) <= d:
r += 1
ans = max(ans, r - l)
print(-1 if ans < k else ans)
posted:
last update:
