适用情况

频繁的对区间进行修改操作,单点查询。

基本使用

初始化,以及跟新操作

int[] diff = new int[n + 1];
for (int i = 0; i < n; ++i) {
int l = 修改的左区间;
int r = 修改的右区间 + 1;
int val = 对区间修改的值;
diff[l] += val;
if (r + 1 < n) diff[r + 1] -= val;
}

查询操作

int[] res = new int[n];
res[0] = diff[0];
for (int i = 1; i < n; ++i) {
res[i] = res[i - 1] + diff[i];
}

基本原理

diff[L...]+3 表示对 diff[L...]所有的元素都 +3diff[R+1...]-3 表示对 diff[R+1...] 所有的元素都 -3

那么,通过对 diff[R+1...] 所有的元素都 -3,就可以抵消 diff[R+1...] 多余的 +3 操作(该多余操作来自:diff[L...]所有的元素都 +3),从而得到只有 diff[L...R] 中所有的元素都 +3