C++ アルゴリズムとデータ構造のライブラリ
#include "library/dp/cumulative_sum/cumulative_sum_rev_diff.hpp"A: 1 4 2 8 2 9
増分 <-- 2 <-- 6 <-- 9 <--
R: 17 17 15 15 9 9 0
$O(N)$
vector<long long> R = cumulative_sum_rev_diff(A);
#pragma once
template <typename T>
vector<long long> cumulative_sum_rev_diff(const vector<T> &A) {
int N = A.size();
vector<long long> R(N + 1);
for (int i = N - 1; i >= 0; --i) {
R[i] = R[i + 1];
if (i & 1) R[i] += abs((i + 1 < N ? A[i + 1] : 0) - A[i]);
}
return R;
}#line 2 "library/dp/cumulative_sum/cumulative_sum_rev_diff.hpp"
template <typename T>
vector<long long> cumulative_sum_rev_diff(const vector<T> &A) {
int N = A.size();
vector<long long> R(N + 1);
for (int i = N - 1; i >= 0; --i) {
R[i] = R[i + 1];
if (i & 1) R[i] += abs((i + 1 < N ? A[i + 1] : 0) - A[i]);
}
return R;
}