公式

B - 散水スプリンクラー / Irrigation Sprinkler 解説 by harurun4635


最大化するのは「水やりできる花の本数」です。

スプリンクラーの位置としては \(s=X_i\) の形だけを考えれば十分です。そうでない場合も、\(s\le X_i\) を満たす最小の \(X_i\) まで \(s\) を右に動かしても、それまで水やりできていた植え込みはすべて水やりできます。

\(s=X_l\) としたとき、水やりできる植え込みは \(X_l\le X_r<X_l+D\) を満たす連続した区間になります。

したがって、尺取り法を用いて \(X_r-X_l<D\) を満たす区間に含まれる \(P_i\) の和の最大値を求めればよいです。最後に全体の花の本数からこの最大値を引いたものが答えです。

計算量は \(O(N)\) です。


実装例

n, d = map(int, input().split())
x = [0] * n
p = [0] * n

for i in range(n):
    x[i], p[i] = map(int, input().split())

ans = 0
s = 0
l = 0

for r in range(n):
    s += p[r]

    while x[r] - x[l] >= d:
        s -= p[l]
        l += 1

    ans = max(ans, s)

print(sum(p) - ans)

投稿日時:
最終更新: