累積和
その要素までの累積和の配列を作る
初期値を{ sum: 0, result: [] }のような形にすることで、O(N)で畳み込みで計算できる
code:example.ts
cumlativeSums(0,1,2,3,4,5) // 0,1,3,6,10,15
code:ts
export const cumulativeSums = (nums: number[]) => {
type _ = { sum: number; result: number[] };
return nums.reduce(
(acc: _, cur) => {
const sum = acc.sum + cur;
return { sum, result: ...acc.result, sum };
},
{ sum: 0, result: [] }
).result;
};
競プロであるあるらしい
よく問題になるのは、「ある配列内の任意の区間での和」を求めること
それを求めるためには、前処理として、
$ s[i]=a[0]+a[1]+⋯+a[i] とした、配列$ s(元の配列aと同じ長さ)が必要
https://qiita.com/drken/items/56a6b68edef8fc605821
https://satanic0258.hatenablog.com/entry/2016/04/10/151315
https://algo-logic.info/range-sum-query-without-update/
2次元累積和
https://masayuki14.hatenablog.com/entry/2020/12/11/2次元累積和をまなぶ
imos法
累積和のアルゴリズムを多次元,多次数に拡張したもので
https://freestylewiki.xyz/fswiki/wiki.cgi?page=imos法・累積和
https://imoz.jp/algorithms/imos_method.html