公式

D - 花壇の水やり / Watering the Flower Bed 解説 by harurun4635


各花について、その花に対して行われる水やりの減少量の合計を求めればよいです。

乾燥度は \(0\) を下回らないよう更新されますが、 「\(v \gets v - D_j\) と更新し、 \(0\) を下回ってもよい」 ということにしましょう。このように変更しても答えは変わりません。( \(0\) 未満にならないと値は変わらず、 \(0\) 未満であれば必ず元気な状態であることから明らかです)

また、\(F_i\) の変化を直接管理するのではなくて、合計で減算される値 \(S_i\) を管理することにして、最後に \(F_i \gets F_i - S_i\) とすることにしましょう。

このように考えれば、初期値がすべて \(0\) の配列に対して、区間 \([L_j,R_j]\) のすべての花に \(D_j\) を加える区間加算が処理できれば良く、これはいもす法によって \(O(N+M)\) で求められます。

n, m, t = map(int, input().split())
f = list(map(int, input().split()))

a = [0] * (n + 1)

for _ in range(m):
    l, r, d = map(int, input().split())
    l -= 1
    a[l] += d
    a[r] -= d

ans = 0
s = 0

for i in range(n):
    s += a[i]
    if f[i] - s <= t:
        ans += 1

print(ans)

投稿日時:
最終更新: