累積和クラスを作ってみた

f:id:peroon:20190415090659j:plain

作成動機

  • 元となる配列サイズ+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