前缀和&差分&二维前缀和

前缀和是一个数组的某项下标之前的所有数组元素的和。

差分是一个数组相邻两元素的差,一般为下标靠后的减去靠前的一个。

若用D(a)表示a的前缀和数组,F(a)表示a的差分数组

1.D(x)=a 
2.F(d)=a

d[i]=a[i]+a[i-1]+a[i-2]+……+a[1],d[i-1]=a[i-1]+a[i-2]+……+a[1]; 
F(d): x[i]=d[i]-d[i-1]=(a[i]+a[i-1]+a[i-2]+……+a[1])-(a[i-1]+a[i-2]+……+a[1])=a[i];
 

前缀和推广到二维中则

由于我们需要用已求得的d[l][r]来求出d[i][j],所以可以用以下方式预处理出二维前缀和。参照下图,根据容斥原理(多加了的要减回来)

计ç®äºç»´åç¼å

计算sum[l,r][m,n]: 

æ¥è¯¢äºç»´åç¼å

举个栗子

给定矩阵

 1  4  8
 6  7  2
 3  9  5

得到对应差分数组

 1  3  4
 5 -2 -9
-3  5  1

当我们想要将一个矩阵加上x时

0  0  0  0  0
0 +x  0  0 -x
0  0  0  0  0
0  0  0  0  0
0 -x  0  0 +x

通过这个修改差分

就可以得到

0  0  0  0  0
0  x  x  x  0
0  x  x  x  0
0  x  x  x  0
0  0  0  0  0

于是区间修改就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值