zoukankan      html  css  js  c++  java
  • HDU2888 Check Corners(二维RMQ)

    有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上

    裸的二维RMQ

     1 #pragma comment(linker, "/STACK:1677721600")
     2 #include <map>
     3 #include <set>
     4 #include <stack>
     5 #include <queue>
     6 #include <cmath>
     7 #include <ctime>
     8 #include <vector>
     9 #include <cstdio>
    10 #include <cctype>
    11 #include <cstring>
    12 #include <cstdlib>
    13 #include <iostream>
    14 #include <algorithm>
    15 using namespace std;
    16 #define INF 0x3f3f3f3f
    17 #define inf (-((LL)1<<40))
    18 #define lson k<<1, L, (L + R)>>1
    19 #define rson k<<1|1,  ((L + R)>>1) + 1, R
    20 #define mem0(a) memset(a,0,sizeof(a))
    21 #define mem1(a) memset(a,-1,sizeof(a))
    22 #define mem(a, b) memset(a, b, sizeof(a))
    23 #define FIN freopen("in.txt", "r", stdin)
    24 #define FOUT freopen("out.txt", "w", stdout)
    25 #define rep(i, a, b) for(int i = a; i <= b; i ++)
    26 #define dec(i, a, b) for(int i = a; i >= b; i --)
    27 
    28 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
    29 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
    30 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
    31 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
    32 
    33 //typedef __int64 LL;
    34 typedef long long LL;
    35 const int MAXN = 50000 + 100;
    36 const int MAXM = 110000;
    37 const double eps = 1e-8;
    38 LL MOD = 1000000007;
    39 
    40 int m, n;
    41 int mx[302][9][302][9];
    42 int idx[302], q, lx, ly, rx, ry;
    43 
    44 void rmq_init(int m, int n) {
    45     for(int i = 0; (1<<i) <= m; i ++) {
    46         for(int j = 0; (1<<j) <= n; j ++) {
    47             if(i == 0 && j == 0) continue;
    48             int len2 = (1 << j), len1 = (1 << i);
    49             for(int x = 1; x + len1 - 1 <= m; x ++) {
    50                 for(int y = 1; y + len2 - 1 <= n; y ++) {
    51                     if(i == 0) mx[x][i][y][j] = max(mx[x][i][y][j - 1], mx[x][i][y + (len2 >> 1)][j - 1]);
    52                     else mx[x][i][y][j] = max(mx[x][i - 1][y][j], mx[x + (len1 >> 1)][i - 1][y][j]);
    53                 }
    54             }
    55         }
    56     }
    57     for(int i = 1; i <= m || i <= n; i ++) {
    58         idx[i] = 0;
    59         while((1 << (idx[i] + 1)) <= i) idx[i] ++;
    60     }
    61 }
    62 
    63 int rmq(int lx, int rx, int ly, int ry) {
    64     int a = idx[rx - lx + 1], la = (1 << a);
    65     int b = idx[ry - ly + 1], lb = (1 << b);
    66     return max(max(max(mx[lx][a][ly][b],
    67                        mx[rx - la + 1][a][ly][b]),
    68                        mx[lx][a][ry - lb + 1][b]),
    69                        mx[rx - la + 1][a][ry - lb + 1][b]);
    70 }
    71 
    72 int main()
    73 {
    74     //FIN;
    75     while(~scanf("%d %d", &m, &n)) {
    76         mem0(mx);
    77         rep (i, 1, m) rep (j, 1, n)
    78             scanf("%d", &mx[i][0][j][0]);
    79         rmq_init(m, n);
    80         scanf("%d", &q);
    81         while(q--) {
    82             scanf("%d %d %d %d", &lx, &ly, &rx, &ry);
    83             int ma = rmq(lx, rx, ly, ry);
    84             printf("%d %s
    ", ma, ma == mx[lx][0][ly][0] || ma == mx[lx][0][ry][0]
    85                                || ma == mx[rx][0][ly][0] || ma == mx[rx][0][ry][0]
    86                                ? "yes" : "no");
    87         }
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/4662619.html
Copyright © 2011-2022 走看看