[BZOJ 2241][SDOI2011]打地鼠(枚举+预处理)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2241

分析:

鉴于R,C的取值很小,于是可以人为枚举R和C的大小,然后判定这个规格的锤子是否可以锤满棋盘并求出最少的次数

假设R*C的锤子可以锤满棋盘,那么便有了锤的方案:{A1,A2,……,An},易得任意交换这个锤的方案的顺序并没有影响,那么我们不妨把锤棋盘左上角的方案放在第一位(肯定有这个方案),然后把左上角的数字全部锤掉。接着就锤第一行第二列……以此类推

即:按行列顺序遍历整个棋盘,以当前格子作为锤子的左上角,把当前格子对应的数字全部锤掉,同时棋盘上对应的区域也要减掉相应值。累加答案。如果在这个过程中出现了某个格子的值<0,那么就说明当前的R和C是不可以锤满整个棋盘的。

那么如何快速的实现呢?

最容易想到的是二维bit,但复杂度高达O(n^4*logn),不够优

可以换个角度想想:看看每个格子会受它的上方和左方哪些格子的影响,很显然,当以这个格子左上方R*C区域内的格子为锤子的左上角锤的话,当前格子会受到影响,减去的值也就是这个R*C区域的值!故可以预处理出矩阵和,然后通过O(1)来查询每个R*C矩阵的值。总的复杂度O(n^4)。

原文地址:https://www.cnblogs.com/wmrv587/p/4160724.html