差分还原

10 分钟

差分数组本身还不是最终结果,它记的是"每个位置比前一个多了多少"。把所有加减都在差分数组上改完后,对它求一遍前缀和,就把每个位置的真实值还原出来了。可以说:差分和前缀和是一对逆运算,一个负责"改区间",一个负责"还原"。

#include <iostream>
using namespace std;
int main() {
    int n = 5;
    int d[7] = {0};
    d[2] += 5; d[5] -= 5;                   // 给第 2~4 个各加 5
    int a[6] = {0};
    for (int i = 1; i <= n; i++)
        a[i] = a[i - 1] + d[i];             // 对差分求前缀和 = 还原
    for (int i = 1; i <= n; i++) cout << a[i] << ' ';
    // 0 5 5 5 0
}

结果第 2、3、4 个都变成了 5,正是我们要的。记住顺序:先在差分上做完所有区间修改,最后再统一求一次前缀和还原,中途不用反复还原。

小纸条

差分和前缀和是什么关系?

登录 后可看答案

差分还原 · C++ 入门 · op599 课程