POI2008 Plot purchase
题目大意:
给出一个$n \times n$的地图,每一个格子有一个价格,找一个矩形,使其价格总和位于$[k,2 \times k]$ 。
题解:
首先看一下$1 \times n$ 的情况,如果有一个格子价值在$[k,2 \times k]$ 之内,那么可以直接输出该点。
其次,若所有格子的和小于k,显然不满足。
接下来,只要没有一个数大于$2 \times k$ 则一定可以构造出可行解。
因为没有一个数大于等于$2 \times k$ ,而又没有一个格子价值在$[k,2 \times k]$ 之内,说明所有格子小于k。
而所有格子的和大于等于k,我们把前缀和写出来,总可以找到一个前缀的和在给定范围内。因为所有格子小于k,这意味着相邻两个前缀和相差并不会大于等于k,因而总可以有解。
因而对于$1 \times n$ 的情况,只要枚举每一个不含大于等于$2 \times k$的数的区间,并判定是否可行即可。
我们发现,这个方法是可以推广到二维矩形上的。
同样的,如果有一个格子价值在$[k,2 \times k]$ 之内,那么可以直接输出该点。
其次,若所有格子的和小于k,显然不满足。
接下来,只要没有一个数大于$2 \times k$ 则一定可以构造出可行解。
首先我们枚举每一行,若这一行的和大于等于k,说明可以在该行找到解。(也就是上面$1 \times n$ 的情况)
若没有找到解,说明每一行的和都小于k。
那么我们可以把这一层压成一个数字。(也就是说,要取就一整行地取)
这样,每一个被压缩的数字都小于k,但它们的和大于等于k,与上面同理,我们可知,一定可以构造出可行解。
综上,只要一个矩形和大于等于k,并且没有一个数大于$2\times k$,我们总可以构造出解。
那么,我们不妨把每一个大于等$2\times k$的数看做障碍。
那么,我们利用最大子矩形算法枚举每一个极大子矩形,看看是否满足即可。
综上,复杂度为$O(n^2)$。
PS. 关于最大子矩形,推荐一篇论文。
Code:
|
|