前缀和用途:
需要多次计算区间和
-
一维前缀和
a[n]=a[n]+a[n-1] -
二维前缀和
适用条件: 一个n*m大的矩阵,有q次询问,每次给定(x1,y1),(x2,y2),求以(x1,y1)为左上角,(x2,y2)为右下角构成的矩形所有元素的和.
例子:
设原数组num如下
1 2 3
2 1 5
4 3 2
以(1,1)到(x,y)围成的矩形二维前缀和
此前缀和数组add如下:
1 2 3
2 6 14
4 13 23
即1行1列的6=1+2+2+1
2行2列的23=2+14+13-6
规律:
add[i][j]=num[i][j]+add[i][j-1]+add[i-1][j]-add[i-1][j-1]
#include<bits/stdc++.h>
using namespace std;
int n,m;
int **h;
int main()
{
cin>>n>>m;
h = new int*[n+1];
memset(h,0,sizeof(int)*(n+1));
for(int i=0; i<=n; i++)
{
h[i]=new int[m+1];//对每一行都有m+1列
memset(h[i],0,sizeof(int)*(m+1));
}
for(int i=1; i<=n; i++)
for(int j=1