题目分析


题目要求给定一个 n 行 m 列的矩阵,以及两个坐标,求两坐标所围成矩阵的和。
1. 暴力解法(模拟)
每次询问直接求和,时间复杂度为 O(q * m * n)。
2. 前缀和优化
1. 预处理前缀和矩阵
我们发现直接计算特定区域面积较难,所以利用前缀和矩阵减去多余部分即可。

2. 使用前缀和矩阵
通过公式快速计算任意子矩阵和。

代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, q;
cin >> n >> m >> q;
vector<vector<int>> arr(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; i++) {
( j = ; j <= m; j++) {
cin >> arr[i][j];
}
}
vector<vector< >> (n + , < >(m + ));
( i = ; i <= n; i++) {
( j = ; j <= m; j++) {
dp[i][j] = dp[i - ][j] + dp[i][j - ] - dp[i - ][j - ] + arr[i][j];
}
}
(q--) {
x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << dp[x2][y2] - dp[x1 - ][y2] - dp[x2][y1 - ] + dp[x1 - ][y1 - ] << endl;
}
;
}


