zoj2859

来源:互联网 发布:高清数字矩阵 编辑:程序博客网 时间:2024/05/21 14:53

第一种算法

rmq

参考http://blog.sina.com.cn/s/blog_88705ca20100ufl2.html

#include<iostream>#include<stdio.h>#include<string.h>#include<limits.h>#include<cmath>#include<algorithm>#define MAX 301using namespace std;int dp[MAX][MAX][9][9];int matrix[MAX][MAX];void build(int n){    int i,j,k;    int c,r;    for(i=1;i<=n;i++)      for(j=1;j<=n;j++)        dp[i][j][0][0]=matrix[i][j];    int m=log(double(n))/log(2.0);    for(i=0;i<=m;i++)      for(j=0;j<=m;j++)      {          if(i==0&&j==0)continue;          for(r=1;r+(1<<i)-1<=n;r++)          {              for(c=1;c+(1<<j)-1<=n;c++)              {                  if(i==0)                  {                      dp[r][c][i][j]=min(dp[r][c][i][j-1],dp[r][c+(1<<(j-1))][i][j-1]);                  }                  else                  {                      dp[r][c][i][j]=min(dp[r][c][i-1][j],dp[r+(1<<(i-1))][c][i-1][j]);                  }              }          }      }}int get(int x1,int y1,int x2,int y2){    int l1=x2-x1+1;    int l2=y2-y1+1;    l1=log(double(l1))/log(2.0);    l2=log(double(l2))/log(2.0);    int m1=dp[x1][y1][l1][l2];    int m2=dp[x2-(1<<l1)+1][y1][l1][l2];    int m3=dp[x1][y2-(1<<l2)+1][l1][l2];    int m4=dp[x2-(1<<l1)+1][y2-(1<<l2)+1][l1][l2];    return min(min(m1,m2),min(m3,m4));}int main(){    int t,n,m,i,j;    int x1,y1,x2,y2;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)          for(j=1;j<=n;j++)            scanf("%d",&matrix[i][j]);        build(n);        scanf("%d",&m);        while(m--)        {            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);            printf("%d\n",get(x1,y1,x2,y2));        }    }}