一维前缀和
若设a[i]为数组第i个元素,则s[i]为数组前i个元素之和。默认s[0]为0代表前0个元素和为0.
所以一维前缀和模板为:
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
s[i]代表前i个元素的和。
二维前缀和
1.
若令单个点为A[i,j]。则
S[i,j]=S[i-1,j]+S[i,j-1]-S[i-1][j-1]+A[i,j].
S[i-1][j]代表红色加绿色部分,S[i,j-1]代表浅蓝加红色部分,A[i,j]代表深蓝部分.
因为S[i-1,j-1]代表上图红色部分,被算了两次,所以要减。
2.
可求A[i,j]:
A[i,j]=S[i,j]-S[i-1,j]-S[i,j-1]+S[i-1][j-1].
3.
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
总-部分1-部分2+多减的。