题目描述: 给定一个 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;
}