二维前缀和
之前已经说过一维前缀和了,二位前缀和就是在此基础上拓展出来的。
定义式 | 递推式 | |
---|---|---|
一维前缀和 | S[i]=S[i-1]+a[i] |
|
二维前缀和 | S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+a[i][j] |
二维差分
引例:
对于一个给定的 n * m 的矩阵 a ,再给出 q 次操作,每次询问给定 x1 ,y1 ,x2 , y2 ,k ,表示对(x1,y1)为左上角,(x2,y2)为右下角的子矩阵加 k ,最后再输出以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的所有元素的和。
思路:
为了减少时间的消耗,我们可以利用差分的方式来对这q次操作进行存储,即利用差分的方式,因此我们需要构造一个二维的差分数组,我们用二维数组d来表示差分数组,那么每次操作,我们只需要对数组b进行如下操作
b[x1][y1]+=k;
b[x2+1][y2+1]+=k;
b[x2+1][y1]-=k;
b[x1][y2+1]-=k;
最后经过这个处理,在进行一起求前缀和即可得出答案。
例题:Monitor
(暂时还没有做,等我做了之后再上解析)