矩阵求和
难度级别:A; 编程语言:不限;运行时间限制:3000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
试题描述
矩阵求和
输入
第一行n和m,表示行数和列数
接下来n行表示矩阵
再来一行一个整数q,表示询问个数
接下来q行,每行四个整数x1,y1,x2,y2表示左上右下的坐标
输出
对于每个询问输出一个整数表示该矩阵范围内的整数和
输入示例
5 5
1 2 5 4 1
1 1 7 6 8
8 7 9 5 2
4 4 4 1 8
5 10 11 13 7
3
2 1 4 3
2 2 5 5
4 1 5 4
输出示例
45
103
52
其他说明
n,m < 2001
q < 100001
矩阵内所有数小于2000
解题思路
因为会存在若干条query,所以应该在矩阵输入的时候便进行预处理。之后利用递推关系求解。
解题代码
#include <cstdio>
#include <iostream>
using namespace std;
long long N, M, e, query, x1, y1, x2, y2, ans, sum[2005][2005] = {0};
int main() {
while (cin >> N >> M) {
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
cin >> e;
sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + e;
}
}
cin >> query;
while (query--) {
cin >> x1 >> y1 >> x2 >> y2;
ans = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1];
cout << ans << endl;
}
}
return 0;
}