B - Inverse Prefix Sum Editorial by MMNMM

余談

C++ では、標準の <numeric> ヘッダにまさにそのものの操作を行う std::adjacent_difference という関数があります。 元となる配列 \(X\) と結果を格納する配列 \(Y\) を用意し、第一・第二引数に \(X\) の先頭と末尾を(std::sort に渡すときなどと同様に)与え、第三引数に \(Y\) の先頭を与えるようにして使います。

実装例は以下のようになります。

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    using namespace std;

    unsigned N;
    cin >> N;
    vector<int> S(N);
    for(auto&& s : S)cin >> s;

    vector<int> A(N);
    adjacent_difference(begin(S), end(S), begin(A));

    for(const auto a : A)cout << a << " ";
    cout << endl;

    return 0;
}

少し発展的ですが、std::istream_iteratorstd::ostream_iterator を用いるとより簡単に書くことができます。
具体的には、このように実装できます。

#include <numeric>
#include <iterator>
#include <iostream>

int main() {
    using namespace std;
    adjacent_difference(next(istream_iterator<int>{cin}), // N を読み飛ばす
                        istream_iterator<int>{},
                        ostream_iterator<int>{cout, " "});
    return 0;
}

posted:
last update: