[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

 

posted @ 2015-04-12 06:05  jklongint  阅读(147)  评论(0编辑  收藏  举报