什么是差分 假设a数组是b数组的前缀和,那么b数组就是a数组的差分数组。差分与前缀和是逆运算。(之所以叫做差分,是因为我们需要维护的数据是“相邻两个数之差”。)由于:a[i] = a[i-1] + b[i],因此 b[i] = a[i] – a[i-1]。
差分的作用 差分数组的功能是修改区间,查询点。
比如:假设有k次操作,每次都需要将a数组中下标为[L, R]之间的数都加上元素x, 那么如果要在0(1)的时间完成上述操作,可以直接对差分数组b进行如下操作。
b[L]+=x;
b[R+1]-=x;
实际上,用上述思想就可以直接构建差分数组,把a数组的每个值想象为要在b数组对应位置要加的值,那么,可以这样构建差分数组:
b[i+1]-=a[i];
b[i]+=a[i];
二维差分:二维前缀和公式:s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j],所以a[i][j]就是s[i][j]的差分数组。
如果要将 x1,y1~x2,y2 子矩阵范围的数+v,可以对对应的差分数组a[i][j]做如下操作:
a[x1][y1]+=v,a[x1][y2+1]-=v,a[x2+1][y1]-=v,a[x2+1][y2+1]+=v。