题目
链接
题意简述
有一个 $n * m \ (n, \ m <= 1000)$ 的整数组成的矩阵。
找出一个 $k * k \ (k <= 100)$ 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
思路
暴力
首先考虑暴力,也就是暴力枚举起点,暴力求最大值和最小值。
时间复杂度: $O(n^{4})$ 。
二维RMQ
看到要求最大值与最小值,就想起RMQ。
常规二维RMQ空间复杂度太大,需要 $(n^{2}2logk)$ 的空间, 开不下啊2333。
但是这道题很特殊,它的查询的是正方形,因此并不需要二维倍增。
所以就砍下了一维。
下面会给出常规二维RMQ与特殊二维RMQ。
空间复杂度: $O(n^{2}logk)$ 。
时间复杂度: $O(n^{2}logk)$ 。
DP
据说可以用单调队列维护。
我太蒻了,并不会。。。。。
代码
二维RMQ
1 | const int kmax_num = 1e3 + 10, kmax_int = 2147483647, kmod = 1e9+7; |
二维RMQ-UDP
1 |
|
杂项
- 这里的二维 $RMQ$ 要是 $(n \ == \ 0 \ || \ m \ == \ 0)$ 就是一个一维 $RMQ$ 。