二维前缀和(C++))

题目描述: 给定一个 n × m 的矩阵,其中每个元素为整数。你需要回答 q 个查询,每个查询给出一个矩形区域的左上角 (x1, y1) 和右下角 (x2, y2),你需要计算这个矩形区域内的元素之和。

输入格式

  • 第一行包含三个整数 n, m, q,分别表示矩阵的行数、列数和查询次数。

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

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

输出格式

  • 对于每个查询,输出一个整数,表示对应矩形区域的元素和。

样例输入

4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 1 2 2
3 3 4 4

样例输出

21
66

代码实现: 

#include 
using namespace std;

const int N = 1000;  

int n, m, q;        
int a[N][N], s[N][N];  

int main() {
    ios::sync_with_stdio(false);  
    cout.tie(0);
    
    // 输入矩阵的行数、列数和查询次数
    cin >> n >> m >> q;


    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> a[i][j];
        }
    }

    // 构建二维前缀和数组
    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];
        }
    }

    while (q--) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;

        // 使用二维前缀和公式计算区域和
        int sum = s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1];
        cout << sum << endl;
    }

    return 0;
}

你可能感兴趣的:(c++,开发语言)