AcWing 796. 子矩阵的和 ( JavaScript )
原题链接
简单
作者:
gaobowen
,
2019-11-13 13:41:22
,
所有人可见
,
阅读 908
let sMtx = [];
let initMatrix2 = (row, column) => {
for (let r = 1; r <= row; r++) {
for (let c = 1; c <= column; c++) {
sMtx[r][c] += sMtx[r][c - 1] + sMtx[r - 1][c] - sMtx[r - 1][c - 1];
}
}
}
let subMatrix = (x1, y1, x2, y2) => {
// 大区域 - 左侧区域 - 上方区域 + 重复区域
return sMtx[x2][y2] - sMtx[x2][y1 - 1] - sMtx[x1 - 1][y2] + sMtx[x1 - 1][y1 - 1];
}
let getInputArgs = line => {
return line.split(' ').filter(s => s !== '').map(x => parseInt(x));
}
var buf = '';
process.stdin.on('readable', function () {
var chunk = process.stdin.read();
if (chunk) buf += chunk.toString();
});
process.stdin.on('end', function () {
// n 行,m 列,q 个询问
let n = 0, m = 0, q = 0;
buf.split('\n').forEach(function (line, lineIdx) {
if (lineIdx === 0) {
n = getInputArgs(line)[0];
m = getInputArgs(line)[1];
q = getInputArgs(line)[2];
sMtx.push(new Array(m + 1).fill(0));
}
else if (lineIdx <= n) {
let arr = getInputArgs(line);
arr.unshift(0)
sMtx.push(arr);
if (lineIdx === n) {
initMatrix2(n, m);
}
}
else {
if (q > 0) {
let subArr = getInputArgs(line);
let result = subMatrix(subArr[0], subArr[1], subArr[2], subArr[3]);
console.log(result);
}
q--;
}
});
});
用 nodejs 写预处理代码太烦了,saber 很容易过不去。用 C++ 和 Python3 写就少很多