..
AcWing 99. 激光炸弹
题目链接:99. 激光炸弹 - AcWing题库
观察 $S[i, j], S[i - 1, j], S[i, j - 1], S[i - 1, j - 1]$ 的关系。
容易得到如下的递推式:
\[S[i, j] = S[i - 1, j] + S[i, j - 1] - S[i - 1, j - 1] + A[i, j]\]同理,对于任意一个边长为 $R$ 的正方形,我们有:
\[\sum_{x = i - R + 1}^i \sum_{y = j - R + 1}^j{A[x, y] = S[i, j] - S[i - R, j] - S[i, j - R] + S [i - R, j - R]}\]因此,我们只需要 $\mathcal{O}(N^2)$ 递推求出二维前缀和 $S$,
然后 $\mathcal{O}(N^2)$ 枚举边长为 $R$ 的正方形的右下角坐标 $(i, j)$,
即可通过上式 $\mathcal{O}(1)$ 计算出该正方形内所有目标的价值之和,更新答案。
上面给出的两个式子蕴含的思想其实就是 “容斥原理”。
上面我们吧 $(X_i, Y_i)$ 作为一个 “格子”,
而原题中 $(X_i, Y_i)$ 是一个点,
并且正方形边上的目标不会被摧毁。
实际上,我们不妨认为这个点就处于 “格子” $(X_i, Y_i)$ 的中心位置,
格子的左上角坐标为 $(X_i - 0.5, Y_i - 0.5)$,
右下角坐标为 $(X_i + 0.5, Y_i + 0.5)$,
而正方形的右下角处于 “格线交点” 上,
即一个值为 “□.5” 的坐标。
这个转化与原问题是等价的。
另外,本题内存限制较为严格,
我们可以省略 $A$ 数组,
读入时直接向 $S$ 中累加。
完整代码:激光炸弹.cpp