[hdu2888]二维RMQ

题意:求矩形内最大值。二维RMQ。

  1 #pragma comment(linker, "/STACK:10240000,10240000")

  2 

  3 #include <iostream>

  4 #include <cstdio>

  5 #include <algorithm>

  6 #include <cstdlib>

  7 #include <cstring>

  8 #include <map>

  9 #include <queue>

 10 #include <deque>

 11 #include <cmath>

 12 #include <vector>

 13 #include <ctime>

 14 #include <cctype>

 15 #include <set>

 16 

 17 using namespace std;

 18 

 19 #define mem0(a) memset(a, 0, sizeof(a))

 20 #define lson l, m, rt << 1

 21 #define rson m + 1, r, rt << 1 | 1

 22 #define define_m int m = (l + r) >> 1

 23 #define Rep(a, b) for(int a = 0; a < b; a++)

 24 #define lowbit(x) ((x) & (-(x)))

 25 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}

 26 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}

 27 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}

 28 

 29 typedef double db;

 30 typedef long long LL;

 31 typedef pair<int, int> pii;

 32 typedef multiset<int> msi;

 33 typedef multiset<int>::iterator msii;

 34 typedef set<int> si;

 35 typedef set<int>::iterator sii;

 36 typedef vector<int> vi;

 37 

 38 const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};

 39 const int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1};

 40 const int maxn = 1e5 + 7;

 41 const int maxm = 1e5 + 7;

 42 const int maxv = 1e7 + 7;

 43 const int MD = 1e9 +7;

 44 const int INF = 1e9 + 7;

 45 const double PI = acos(-1.0);

 46 const double eps = 1e-10;

 47 

 48 int a[300][300], t[301], f[300][9][300][9], n, m;

 49 

 50 void Init_RMQ() {

 51     for (int i = 0; i < n; i++) {

 52         for (int j = 0; j < m; j++) {

 53             f[i][0][j][0] = a[i][j];

 54         }

 55     }

 56     for (int dx = 0; dx <= 8; dx++) {

 57         for (int dy = 0; dy <= 8; dy++) {

 58             if (dx == 0 && dy == 0) continue;

 59             for (int i = 0; i + (1 << dx) <= n; i++) {

 60                 for (int j = 0; j + (1 << dy) <= m; j++) {

 61                    int &p = f[i][dx][j][dy];

 62                     if (dx) p = max(f[i][dx - 1][j][dy], f[i + (1 << (dx - 1))][dx - 1][j][dy]);

 63                     else p = max(f[i][dx][j][dy - 1], f[i][dx][j + (1 << (dy - 1))][dy - 1]);

 64                 }

 65             }

 66         }

 67     }

 68 }

 69 

 70 int RMQ(int x1, int y1, int x2, int y2) {

 71     int l1 = t[x2 - x1 + 1], l2 = t[y2 - y1 + 1];

 72     return max(f[x1][l1][y1][l2], max(f[x1][l1][y2 - (1 << l2) + 1][l2],

 73             max(f[x2 - (1 << l1) + 1][l1][y1][l2], f[x2 - (1 << l1) + 1][l1][y2 - (1 << l2) + 1][l2])));

 74 }

 75 

 76 int main() {

 77     //freopen("in.txt", "r", stdin);

 78     for (int i = 1; i <= 300; i++) {

 79         int j = 0;

 80         while ((1 << (j + 1)) <= i) j++;

 81         t[i] = j;

 82     }

 83     int x1, x2, y1, y2, q;

 84     while (cin >> n >> m) {

 85         for (int i = 0; i < n; i++) {

 86             for (int j = 0; j < m; j++) {

 87                 scanf("%d", &a[i][j]);

 88             }

 89         }

 90         Init_RMQ();

 91         cin >> q;

 92         for (int i = 0; i < q; i++) {

 93             scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

 94             x1--; x2--; y1--; y2--;

 95             int res = RMQ(x1, y1, x2, y2);

 96             printf("%d ", res);

 97             if (a[x1][y1] == res || a[x2][y1] == res || a[x1][y2] == res || a[x2][y2] == res) puts("yes");

 98             else puts("no");

 99         }

100     }

101     return 0;

102 }
View Code

 

你可能感兴趣的:(HDU)