• 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 }
  • 相关阅读:
    2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
    P1880 [NOI1995]石子合并【区间dp】
    P1280 尼克的任务
    P1041 传染病控制【暴搜】
    Heavy Transportation POJ
    【空间】C++内存管理
    【编译器】G++常用命令
    【NOIP2011】【Luogu1003】铺地毯
    【Luogu1739】表达式括号匹配
    【Luogu1160】队列安排
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/4662619.html
Copyright © 2020-2023  润新知