现在的位置: 首页 > 综合 > 正文

HDOJ2888-裸二维RMQ

2013年12月06日 ⁄ 综合 ⁄ 共 1234字 ⁄ 字号 评论关闭
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;

const int NN=301;

int n,m,a[NN][NN],dp[NN][NN][9][9]; //内存卡得紧

inline void get(int &x)
{
    char c=getchar();
    while (c<'0' || c>'9') c=getchar();
    x=c-'0';
    c=getchar();
    while (c>='0' && c<='9') x=x*10+c-'0',c=getchar();
}

void RMQ_init()
{
    for (int i=1; i<=n; i++)
      for (int j=1; j<=m; j++) dp[i][j][0][0]=a[i][j];
    int lim1=log(n)/log(2);
    int lim2=log(m)/log(2);
    for (int k1=0; k1<=lim1; k1++)
      for (int k2=0; k2<=lim2; k2++) if (k1+k2)
        for (int i=1; i<=n-(1<<k1)+1; i++)
          for (int j=1; j<=m-(1<<k2)+1; j++)
          {
              if (k2)
                dp[i][j][k1][k2]=max(dp[i][j][k1][k2-1],dp[i][j+(1<<(k2-1))][k1][k2-1]);
              else
                dp[i][j][k1][k2]=max(dp[i][j][k1-1][k2],dp[i+(1<<(k1-1))][j][k1-1][k2]);
          }
}

int RMQ(int x1,int y1,int x2,int y2)
{
    int k1=log(x2-x1+1)/log(2);
    int k2=log(y2-y1+1)/log(2);
    int s1=max(dp[x1][y1][k1][k2],dp[x2-(1<<k1)+1][y2-(1<<k2)+1][k1][k2]);
    int s2=max(dp[x1][y2-(1<<k2)+1][k1][k2],dp[x2-(1<<k1)+1][y1][k1][k2]);
    return max(s1,s2);
}

int main()
{
    int q,w,x1,y1,x2,y2;
    while (scanf("%d%d",&n,&m)==2)
    {
        for (int i=1; i<=n; i++)
          for (int j=1; j<=m; j++) get(a[i][j]);

        RMQ_init();
        scanf("%d",&q);
        while (q--)
        {
            get(x1); get(y1);
            get(x2); get(y2);
            w=RMQ(x1,y1,x2,y2);
            printf("%d ",w);
            if (a[x1][y1]==w || a[x2][y1]==w || a[x1][y2]==w || a[x2][y2]==w)
                printf("yes\n");
            else
                printf("no\n");
        }
    }
    return 0;
}

抱歉!评论已关闭.