Official

F - 連続区間の売上目標 / Sales Target for Consecutive Intervals Editorial by sounansya


\(\displaystyle A_i=\sum_{j=0}^i V_j\) \((0\le i\le N)\) とすると、求める値は以下の条件を全て満たす整数の組 \((l,r)\) の個数と一致します。

  • \(0\le l < r\le N\)
  • \(A_r - A_l \geq K\)

ここで、\(A\) は単調増加列であるため尺取り法を用いてこの問題を解くことができます。計算量は \(O(N)\) です。

実装例(Python3)

n, k = map(int, input().split())
v = list(map(int, input().split()))
a = [0]
for val in v:
    a.append(a[-1] + val)
ans = 0
r = 0
for l in range(n + 1):
    while r != n + 1 and a[l] + k > a[r]:
        r += 1
    ans += n + 1 - r
print(ans)

posted:
last update: