D - Pond
题目
简要题意
有一张 (n imes n) 的方格,((i,j)) 格子上的数字为 (a_{i,j})。你需要在这张方格里找到一个 (k imes k) 的方格使得中位数最小。
中位数定义为数字第 (lfloor frac{k^2}{2} floor+1) 大的格子。
数据范围与提示
(1le kle nle 800, a_{i,j}le 1e9)。
解法
看到 “中位数“,”最小“ 就自然地转化到二分。
二分最小中位数,我们可以进行 (mathcal O(n^2)) 的判断:先对于数字大于 ( m mid) 的数的个数进行二维前缀和,然后枚举 (k imes k) 的方格左上角,计算出这个方格中数字大于 ( m mid) 的数的个数 (tmp)。容易发现,如果所有方格的 (tmp) 最小值小于 (lfloor frac{k^2}{2} floor+1) 就意味着 ( m mid) 可能是一个合法解,我们将 (rleftarrow m mid)。否则将 (l leftarrow ext{mid}+1)。
时间复杂度 (mathcal O(n^2 log a))。