作成動機
- 元となる配列サイズ+1で作ったり、範囲の和を取る時に添え字でミスりそう
- いつも同じ作成をしているので省略したい
Code
struct AccSum{ vector<ll> Ac; ll L; AccSum(vector<ll> &A){ L = A.size(); Ac.resize(L+1); FOR(i, 0, L){ Ac[i+1] = Ac[i] + A[i]; } } // sum of [a, b] ll sum(ll a, ll b){ if(a<0) return -1; if(b>L-1) return -1; return Ac[b+1] - Ac[a]; } };
動作確認
https://atcoder.jp/contests/abc124/submissions/4982319
追記:簡単な累積和の書き方
- partial_sumというのがある
- 添字がずれるのが慣れない
int main(){ // input VI A = {1, 8, 2, 3, 7, 4}; ll N = A.size(); VI acc(N+1); partial_sum(ALL(A), acc.begin()+1); debug(A); debug(acc); // 2-4までの和 (2+3+7=12) ll sum = acc[5] - acc[2]; p(sum); return 0; }
[A]: {1, 8, 2, 3, 7, 4} [acc]: {0, 1, 9, 11, 14, 21, 25} 12