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

HDU 2888 二维RMQ

2019年03月18日 ⁄ 综合 ⁄ 共 1117字 ⁄ 字号 评论关闭

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[303][303],maxn[9][9][301][301],n,m;


void initRmq()
{
    int i,j,x,y;
    for(i=0;i<n;i++) for(j=0;j<m;j++) maxn[0][0][i][j]=a[i][j];
    for(i=0;(1<<i)<n;i++) for(j=0;(1<<j)<m;j++) for(x=0;x+(1<<i)<=n;x++) for(y=0;y+(1<<j)<=m;y++) if(i || j)
    {
        if(i) maxn[i][j][x][y]=max(maxn[i-1][j][x][y],maxn[i-1][j][x+(1<<(i-1))][y]);
        else maxn[i][j][x][y]=max(maxn[i][j-1][x][y],maxn[i][j-1][x][y+(1<<(j-1))]);
    }
}
inline int rmq(int x1,int y1,int x2,int y2)
{
    int i=log(x2-x1+1)/log(2),j=log(y2-y1+1)/log(2);
    return max(max(maxn[i][j][x1][y1],maxn[i][j][x2-(1<<i)+1][y1]),max(maxn[i][j][x1][y2-(1<<j)+1],maxn[i][j][x2-(1<<i)+1][y2-(1<<j)+1]));
}

int main()
{
    //ios::sync_with_stdio(false);
    while(scanf("%d %d",&n,&m)==2)
    {
        int i,j,x1,y1,x2,y2,ans,q;
        for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&a[i][j]);//cin>>a[i][j];
        initRmq();
        scanf("%d",&q);//cin>>q;
        for(i=0;i<q;i++)
        {
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);//cin>>x1>>y1>>x2>>y2;
            x1--;y1--;x2--;y2--;
            printf("%d ",ans=rmq(x1,y1,x2,y2));//cout<<rmq(x1,y1,x2,y2)<<" ";
            if(a[x1][y1]==ans || a[x1][y2]==ans || a[x2][y1]==ans || a[x2][y2]==ans) puts("yes");
            else puts("no");
        }
    }
    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.