解题思路
方格列号、行号都在 1 到 1000 之间。边长为 s 的框就是连续 s 列、连续 s 行。s 越大越容易凑够 k 件,因此可以二分最小的 s。
- 把每件货记到 1000×1000 的方格表上。货的位置互不相同。
- 做二维前缀和。查询任意连续列、连续行里的件数是 O(1)。
- 检查边长 s 时,枚举框的左上角。闭区间列 [c,c+s−1]、行 [r,r+s−1] 的件数不少于 k,这个边长就可行。
- 若选中若干件货,列号最小最大是 L,R,行号最小最大是 U,D,盖住它们的最小边长是 max(R−L,D−U)+1。所以答案落在 1 到 1000 之间,而且最优框可以贴着这些货,不会伸到编号范围外面。
- 只需要 1 件时,答案直接是 1。