ABC267C - Index × A(Continuous ver.)

考え方

\begin{aligned}
&\sum_{i = 1}^{M} i \times A_{k + i} \\
&=\sum_{i = 1}^{M} (k + i) \times A_{k + i} - k\sum_{i = 1}^{M} A_{k + i}
\end{aligned}
だから,累積和を2種類計算しておけば良い.

回答例

N, M = map(int, input().split())
A = list(map(int, input().split()))

acc1 = [0]
for a in A:
    acc1.append(acc1[-1] + a)
acc2 = [0]
for i, a in enumerate(A):
    acc2.append(acc2[-1] + (i + 1) * a)

ans = -1 << 60
for k in range(N - M + 1):
    sum1 = acc1[k + M] - acc1[k]
    sum2 = acc2[k + M] - acc2[k]
    ans = max(ans, sum2 - k * sum1)

print(ans)