题目链接: 十字爆破
正常暴力遍历累加会超时, 可以先进行预处理, 先把每一行和每一列的和都算出来存好, 之后再累加算出来的和即可, 注意在计算某一个坐标位置的行和加列和时, 该坐标位置本身会被累加两次, 注意减去本身的一个值:
题解代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<vector<long>> arr(n, vector<long>(m));
//存储每行/每列的和
vector<long> row(n);
vector<long> col(m);
//输入+预处理
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
scanf("%ld", &arr[i][j]);
row[i] += arr[i][j];
col[j] += arr[i][j];
}
}
//输出结果
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
printf("%ld ", row[i] + col[j] - arr[i][j]);
}
printf("\n");
}
return 0;
}
ps: 注意累加变量类型要用 long/long long, 否则会溢出.