2022/02/08
每点亮 1 盏灯,增加了 4 个线性函数
每查询 1 盏灯,最多关掉 9 盏灯,其中每关掉 1 盏灯,要删除 4 个线性函数
用了 1 + 4 个 hash表 减少时间复杂度
let gridIllumination = function (n, lamps, queries) {
let ans = [];
let lampsMap = getLampsMap(lamps);
let fnMap = genFnCountMap(lampsMap);
for (let [p, q] of queries) {
if (fnMap.is[p] || fnMap.js[q] || fnMap.ij[q - p] || fnMap.ji[q + p]) {
ans.push(1);
} else {
ans.push(0);
}
updateFnMap(fnMap, lampsMap, p, q);
}
return ans;
};
let getLampsMap = function (lamps) {
let p = {};
lamps.forEach(([i, j]) => {
if (!p[i]) {
p[i] = {};
}
p[i][j] = true;
});
return p;
};
let genFnCountMap = function (lampsMap) {
let fnMap = {
is: {}, // 存 x = i 的 i
js: {}, // 存 y = j 的 j
ij: {}, // 存 y = x + b 的 b,b = j - i
ji: {}, // 存 y = -x + b 的 b,b = j + i
};
Object.keys(lampsMap).forEach(i => {
Object.keys(lampsMap[i]).forEach(j => {
i = Number.parseInt(i);
j = Number.parseInt(j);
fnMap.is[i] = (fnMap.is[i] || 0) + 1;
fnMap.js[j] = (fnMap.js[j] || 0) + 1;
fnMap.ij[j - i] = (fnMap.ij[j - i] || 0) + 1;
fnMap.ji[j + i] = (fnMap.ji[j + i] || 0) + 1;
});
});
return fnMap;
};
let deltas = [-1, 0, 1].flatMap(d1 => {
return [-1, 0, 1].map(d2 => [d1, d2]);
});
let updateFnMap = function (fnMap, lampsMap, p, q) {
deltas.forEach(([d1, d2]) => {
let i = p + d1;
let j = q + d2;
if (lampsMap[i] && lampsMap[i][j]) {
fnMap.is[i] -= 1;
fnMap.js[j] -= 1;
fnMap.ij[j - i] -= 1;
fnMap.ji[j + i] -= 1;
lampsMap[i][j] = false;
}
});
};