mini notes

競技プログラミングの解法メモを残していきます。

ABC159 F - Knapsack for All Segments (600)

問題:F - Knapsack for All Segments

解答:Submission #14462241 - AtCoder Beginner Contest 159

解法:Ax1 + Ax2 + ... + Axk = Sなる(x1, x2, ..., xk)が見つかったとして、この(x1, x2, ..., xk)がΣf(L, R) に与える寄与を考える。
L ≦ x1 かつ xk ≦ Rなる(L, R)について、f(L, R)に1加算されるため、(x1, x2, ..., xk)がΣf(L, R)に与える寄与はこの(L, R)の組数であるため、L * (N - R + 1)である。
よって、変数ansを準備しておき、(x1, x2, ..., xk)が見つかったならば、ans += L * (N - R + 1) すればよい。

これをdpと同時に行うことを考える。
dp[i][j] := 右端がi、部分和がjであるときの左端のインデックス(1-indexed)の合計とする。すると、j = sになった時にans += dp[i][s] * (n - i) すればよい。(右端のインデックスiは0-indexed)
右端が同じものをまとめて計算するイメージである。