题目

https://www.acwing.com/problem/content/798/

1-miuo.webp

算法思想

这是前缀和问题的二维矩阵版本,在读取数据的时候,每个点代表下图所示范围内的和:

1-ksxg.webp

公式如下:

arr[x][y] = arr[x-1][y] + arr[x][y-1] - arr[x-1][y+1];

1-tsug.webp

本题目给出两个点,要求计算出两个对角点之间的总和

2-xhme.webp

公式如下:

arr[x2][y2] - arr[x2][y1-1] - arr[x1-1][y2] + arr[x1-1][y1-1];

3-vmld.webp

题解

#include <iostream>

const int N = 1010;
int arr[N][N];

int main()
{
    int n, m, q;
    std::cin >> n >> m >> q;
    
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            std::cin >> arr[i][j];
            
            arr[i][j] += (arr[i-1][j] + arr[i][j-1] - arr[i-1][j-1]);
        }
    }
    
    int x1, y1, x2, y2;
    while(q--) 
    {
        std::cin >> x1 >> y1 >> x2 >> y2;
        std::cout << (arr[x2][y2] - arr[x2][y1-1] - arr[x1-1][y2] + arr[x1-1][y1-1]) << std::endl;
    }
}

复杂度

时间复杂度:O(1),空间复杂度:O(1)