競技プログラミング用 知識集積所

ABC423E - Sum of Subarrays

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略

考え方

まず、式変形が必要。
Σ[l=L->R] Σ[r=l->R] Σ[j=l->r] A[j]
でA[i]が何回足されるかを考える。
まず、l>=Lであるため、i<Lであれば明らかに0回。
同様に、i>Rである場合も0回。
L≦i≦Rである場合は、l≦i≦rであるようなlとrの取り方の個数だけ足すことになる。
つまり、(i-L)*(R-i)回足すことになる。

これを、添字を1ずらした上で区間[L,R)で扱えるように考えると、
a[i]*{(-1)*i^2+(L+R-1)*i-R*(L-1)}
の総和を求める問題となる。

これは、
- a[i]*i^2 + (L+R-1)*a[i]*i - R*(L-1)*a[i]
の[L,R)での和と考えると、
  • a[i]*i^2の累積和
  • a[i]*iの累積和
  • a[i]の累積和
を個別に用意しておくことで計算可能。

解答例

解答例
(命名規則の都合で、問題のLとRをlとrにしてある。問題のlとrはコードに登場しない。)

注意点

aが小さいが要素数が多いため、a[i]*i^2の累積和くらいでもうint型をはみ出てしまう。

別解

タグ:

累積和
ウィキ募集バナー