zoukankan      html  css  js  c++  java
  • 【HDOJ】2888 Check Corners

    二维RMQ。

     1 /* 2888 */
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <cstdlib>
     7 using namespace std;
     8 
     9 #define MAXN 305
    10 #define MAXM 9
    11 
    12 int bit[MAXN];
    13 int dp[MAXN][MAXN][MAXM][MAXM];
    14 int n, m;
    15 
    16 void RMQ_init() {
    17     int i, j, k;
    18     int ii, jj;
    19 
    20     for (i=1; i<=n; ++i)
    21         for (j=1; j<=m; ++j)
    22             scanf("%d", &dp[i][j][0][0]);
    23     for (ii=0; (1<<ii)<=n; ++ii) {
    24         for (jj=0; (1<<jj)<=m; ++jj) {
    25             if (ii==0 && jj==0)
    26                 continue;
    27             for (i=1; i+(1<<ii)-1<=n; ++i) {
    28                 for (j=1; j+(1<<jj)-1<=m; ++j) {
    29                     if (ii)
    30                         dp[i][j][ii][jj] = max(dp[i][j][ii-1][jj], dp[i+(1<<(ii-1))][j][ii-1][jj]);
    31                     else
    32                         dp[i][j][ii][jj] = max(dp[i][j][ii][jj-1], dp[i][j+(1<<(jj-1))][ii][jj-1]);
    33                 }
    34             }
    35         }
    36     }
    37 }
    38 
    39 int RMQ(int lx, int ly, int rx, int ry) {
    40     int kx = 0, ky = 0;
    41 
    42     while ((1<<(kx+1)) <= (rx-lx+1))
    43         ++kx;
    44     while ((1<<(ky+1)) <= (ry-ly+1))
    45         ++ky;
    46     return max(
    47         max(dp[lx][ly][kx][ky], dp[rx-(1<<kx)+1][ly][kx][ky]),
    48         max(dp[lx][ry-(1<<ky)+1][kx][ky], dp[rx-(1<<kx)+1][ry-(1<<ky)+1][kx][ky])
    49     );
    50 }
    51 
    52 int main() {
    53     int i, j, k;
    54     int r1, c1, r2, c2;
    55 
    56     #ifndef ONLINE_JUDGE
    57         freopen("data.in", "r", stdin);
    58         freopen("data.out", "w", stdout);
    59     #endif
    60     
    61     while (scanf("%d %d", &n, &m)!=EOF)  {
    62         RMQ_init();
    63         scanf("%d", &j);
    64         while (j--) {
    65             scanf("%d %d %d %d", &r1, &c1, &r2, &c2);
    66             if (r1 > r2) swap(r1, r2);
    67             if (c1 > c2) swap(c1, c2);
    68             k = RMQ(r1, c1, r2, c2);
    69             if (k==dp[r1][c1][0][0] || k==dp[r1][c2][0][0] || k==dp[r2][c1][0][0] || k==dp[r2][c2][0][0])
    70                 printf("%d yes
    ", k);
    71             else
    72                 printf("%d no
    ", k);
    73         }
    74     }
    75 
    76     return 0;
    77 }
  • 相关阅读:
    CSS3动画基本的转换和过渡
    学习进度(2016.4.3)
    敏捷开发方法综述
    学习进度(2016.3.27)
    数组问题(二)求环形数组子数组和的最大值
    数组问题(一)求子数组和的最大值
    学习进度(2016.3.20)
    程序设计之四则运算三
    学习进度(2016.3.13)
    Right-BICEP 测试四则运算二程序
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4349795.html
Copyright © 2011-2022 走看看