二维RMQ求矩阵最值学习、

来源:互联网 发布:抢购秒杀软件 编辑:程序博客网 时间:2024/05/18 02:00

学习博客:blackcat


练习题:传送门


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <ctime>#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <utility>using namespace std;#define LL long long#define pb push_back#define mk make_pair#define pill pair<int, int>#define mst(a, b)memset(a, b, sizeof a)#define REP(i, x, n)for(int i = x; i <= n; ++i)const int MOD = 1e9 + 7;const int qq = 505 + 10;const int INF = 1e9 + 10;int dp[qq][qq][10][10];int bitx[1005];int a[qq][qq];const int inf = 0x7fffffff;void ST_2D(int n, int m) {// Initbitx[1] = 0;for(int i = 2; i <= max(n, m); i <<= 1) {bitx[i] = bitx[i >> 1] + 1; }for(int i = 2; i <= max(n, m); ++i) {if(bitx[i] == 0)bitx[i] = bitx[i - 1];}for(int i = 1; i <= n; ++i) {for(int j = 1; j <= m; ++j) {dp[i][j][0][0] = a[i][j];}}for(int k = 0; (1 << k) <= n; ++k) {for(int l = 0; (1 << l) <= m; ++l) {if(l == 0 && k == 0)continue;for(int i = 1; i + (1 << k) - 1 <= n; ++i) {for(int j = 1; j + (1 << l) - 1 <= m; ++j) {if(!k)dp[i][j][k][l] = max(dp[i][j][k][l - 1], dp[i][j + (1 << (l - 1))][k][l - 1]);elsedp[i][j][k][l] = max(dp[i][j][k - 1][l], dp[i + (1 << (k - 1))][j][k - 1][l]);}}}}}int Query(int x1, int y1, int x2, int y2) {// Queryint k1 = bitx[x2 - x1 + 1], k2 = bitx[y2 - y1 + 1];int m1 = dp[x1][y1][k1][k2];int m2 = dp[x2 - (1 << k1) + 1][y1][k1][k2];int m3 = dp[x1][y2 - (1 << k2) + 1][k1][k2];int m4 = dp[x2 - (1 << k1) + 1][y2 - (1 << k2) + 1][k1][k2];return max(max(m1, m2), max(m3, m4));}int main(){int n, m, k, q;scanf("%d%d%d%d", &n, &m, &k, &q);for(int i = 1; i <= n; ++i) {for(int j = 1; j <= m; ++j) {a[i][j] = inf;}}for(int x, y, t, i = 1; i <= q; ++i) {scanf("%d%d%d", &x, &y, &t);a[x][y] = t;}ST_2D(n, m);int ans = inf;for(int i = 1; i + k - 1 <= n; ++i) {for(int j = 1; j + k - 1 <= m; ++j) {ans = min(ans, Query(i, j, i + k - 1, j + k - 1));}}if(ans == inf)ans = -1;printf("%d\n", ans);return 0;}


原创粉丝点击