Check Corners

来源:互联网 发布:ubuntu安装git失败 编辑:程序博客网 时间:2024/06/05 02:48

http://acm.hdu.edu.cn/showproblem.php?pid=2888


#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;const int maxn=300;int di[maxn][maxn][9][9];void st(int m,int n){int k1,k2,u1,u2;k1=(int)((log(1.0*m))/log(2.0));k2=(int)((log(1.0*n))/log(2.0));for(int kx=0;kx<=k1;kx++)for(int ky=0;ky<=k2;ky++)if(kx||ky)for(int i=0;i+(1<<kx)-1<m;i++)for(int j=0;j+(1<<ky)-1<n;j++){if(kx==0)di[i][j][kx][ky]=max(di[i][j][kx][ky-1],di[i][j+(1<<(ky-1))][kx][ky-1]);else if(ky==0)di[i][j][kx][ky]=max(di[i][j][kx-1][ky],di[i+(1<<(kx-1))][j][kx-1][ky]);else{u1=max(di[i][j][kx-1][ky-1],di[i+(1<<(kx-1))][j][kx-1][ky-1]);u2=max(di[i][j+(1<<(ky-1))][kx-1][ky-1],di[i+(1<<(kx-1))][j+(1<<(ky-1))][kx-1][ky-1]);di[i][j][kx][ky]=max(u1,u2);}}}int sou(int r1,int c1,int r2,int c2){int k1,k2;k1=(int)((log(1.0*(r2-r1+1)))/log(2.0));k2=(int)((log(1.0*(c2-c1+1)))/log(2.0));//system("pause");int ans1,ans2;ans1=max(di[r1][c1][k1][k2],di[r2-(1<<k1)+1][c1][k1][k2]);ans2=max(di[r1][c2-(1<<k2)+1][k1][k2],di[r2-(1<<k1)+1][c2-(1<<k2)+1][k1][k2]);return max(ans1,ans2);}int main(int argc, char *argv[]){int m,n;while(scanf("%d%d",&m,&n)==2){for(int i=0;i<m;i++)for(int j=0;j<n;j++)scanf("%d",&di[i][j][0][0]);st(m,n);int p;scanf("%d",&p);int r1,c1,r2,c2,da;while(p--){scanf("%d%d%d%d",&r1,&c1,&r2,&c2);da=sou(r1-1,c1-1,r2-1,c2-1);printf("%d ",da);if(da==di[r1-1][c1-1][0][0]||da==di[r1-1][c2-1][0][0]||da==di[r2-1][c1-1][0][0]||da==di[r2-1][c2-1][0][0])printf("yes\n");else printf("no\n");}}return 0;}


0 0
原创粉丝点击