YSMull
<-- algorithm



原题链接

每点亮 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;
    }
  });
};