二维差分原理
用A表示原数组,用B表示差分数组,先看初始状态
我们假设要对(x1,y1)(x2,y2)区间内的数据进行+d的操作
我们现在差分数组B的(x1,y1)处+d,并把它对A的影响表示出来,由于b是差分数组,a是通过b求和得到的,可以得出
B的(x1,y1)+d之后,A的相同颜色的阴影部分全部加d;
但是这样就多加了一些d,我们把其余的剪掉,直接用图表示
新的阴影部分的d全部被剪掉了,恢复了未改变前的值,继续调整
到这里可以看到,我们有一个部分多减去了,再加上
那么就可以利用差分数组B来完成对选定区间的操作了,这里用代码写为
int x1 = scan.nextInt();
int y1 = scan.nextInt();
int x2 = scan.nextInt();
int y2 = scan.nextInt();
int d = scan.nextInt();
B[x1][y1]+=d;
B[x2+1][y1]-=d;
B[x1][y2+1]-=d;
B[x2+1][y2+1]+=d;
取反情况
如果不进行加减,而进行取反(0或1),怎么运用差分数组呢?
这里直接进行加减推不下去,那么我们可以考虑,假设一开始都是0,那么经过偶数次变换,他还是0,经过奇数次变换,成为1,那么每次对要改变的区间+1,最后求和(原数组的时候,直接看求和结果是奇数还是偶数就OK了),我一开始没有想到这个思路,以后遇到相似情况可以考虑。