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_iterator
や std::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: