差分还原
约 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,正是我们要的。记住顺序:先在差分上做完所有区间修改,最后再统一求一次前缀和还原,中途不用反复还原。
小纸条
差分和前缀和是什么关系?
登录 后可看答案