算法练习--二维差分

二维差分原理

用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了),我一开始没有想到这个思路,以后遇到相似情况可以考虑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值