11.二维前缀和

输入一个 n 行 m 列的整数矩阵,再输入 qq 个询问,每个询问包含四个整数 x1,y1,x2,y2表示一个子矩阵的左上角坐标和右下角坐标。

 

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数 n,m,q。

接下来 n 行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含四个整数 x1,y1,x2,y2表示一组询问。

输出格式

共 q 行,每行输出一个询问的结果。

数据范围

1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000

输入样例:

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出样例:

17
27
21

 思路:

对于二维变量,前缀和要明白两个问题:

怎么求Si

怎么求(x1,y1),(x2,y2)形成的一个对角矩阵内元素的和

int n;    //行
int m;    //列
S[n][m] // 存储前缀和的数组
a[n][m] // 存储数据的数组
for(int i = 1; i <= n; i ++ )
    for(int j = 1; j <= m; j ++ )
        S[i][j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + a[i][j];

 对于某一点的前缀和,即以此点为矩阵右下角的和,左上角为大正方体的左上角,绿色区域的左上角的点为(x1,y1)右下角为(x2,y2),蓝色加红色区域前缀和表示为S[x1-1][y2],黄色区域加红色区域前缀和表示为S[x2][y1 - 1] ,红色区域前缀和表示为[x1 - 1][y1 - 1],四个颜色的前缀和表示为S[x2,y2],以(x1,y1)(x2,y2)为对角矩阵的和为S[x2][y2] - S[x1 - 1][y2] - S[x2][y1 - 1] + S[x1-1][y1 - 1].

11.二维前缀和_第1张图片

代码实现:

#include 
using namespace std;
int main(){
    int n, m, q;
    cin >> n >> m >> q;
    int k[n + 1][m + 1];
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ )
        {
            cin >> k[i][j];
            k[i][j] += k[i-1][j] + k[i][j - 1] - k[i - 1][j - 1];
        }
    while(q -- ){
        int x1,y1,x2,y2;
        cin >> x1 >> y1 >> x2 >> y2;
        cout << k[x2][y2] - k[x1 - 1][y2] - k[x2][y1 - 1] + k[x1 - 1][y1 - 1] << endl;
    }
    return 0;
}

你可能感兴趣的:(算法,算法)