差分是什么

10 分钟

前缀和擅长"快速查一段的和",差分正好相反,擅长"快速给一段整体加一个数"。想给第 到第 个数每个都加 ,一个个加要改一整段;用差分只要动两个位置:在 +v,在 -v

#include <iostream>
using namespace std;
int main() {
    int d[7] = {0};                         // 差分数组,多留一位
    int l = 2, r = 4, v = 5;                // 给第 2~4 个各加 5
    d[l] += v;
    d[r + 1] -= v;                          // 只改两处
    cout << "d[2]=" << d[2] << "  d[5]=" << d[5];  // d[2]=5  d[5]=-5
}

给第 2 到第 4 个各加 5,就是把 d[2] 加 5、d[5] 减 5 这两处。别忘了那个 -v——它负责在区间末尾"关掉"这次加法,漏了它后面的数会被一直多加。

小纸条

给第 2 到第 4 个各加 5,差分数组要改哪两处?

登录 后可看答案

差分是什么 · C++ 入门 · op599 课程