二维RMQ模板。。。。
4 4 4 4 10 7 2 13 9 11 5 7 8 20 13 20 8 2 4 1 1 4 4 1 1 3 3 1 3 3 4 1 1 1 1
20 no 13 no 20 yes 4 yes
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[10][10][310][310],mp[310][310],n,m;
void RMQ_2D_init()
{
int mx=floor(log(n+0.0)/log(2.0));
int my=floor(log(m+0.0)/log(2.0));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[0][0][i][j]=mp[i][j];
for(int i=0;i<=mx;i++)
{
for(int j=0;j<=my;j++)
{
if(i==0&&j==0) continue;
for(int row=1;row+(1<<i)-1<=n;row++)
{
for(int col=1;col+(1<<j)-1<=m;col++)
{
if(i==0)
dp[i][j][row][col]=max(dp[i][j-1][row][col],dp[i][j-1][row][col+(1<<(j-1))]);
else
dp[i][j][row][col]=max(dp[i-1][j][row][col],dp[i-1][j][row+(1<<(i-1))][col]);
}
}
}
}
}
int RMQ_2D(int x1,int y1,int x2,int y2)
{
int mx=floor(log(x2-x1+1.0)/log(2.0));
int my=floor(log(y2-y1+1.0)/log(2.0));
int m1=dp[mx][my][x1][y1];
int m2=dp[mx][my][x2-(1<<mx)+1][y2-(1<<my)+1];
int m3=dp[mx][my][x1][y2-(1<<my)+1];
int m4=dp[mx][my][x2-(1<<mx)+1][y1];
return max(max(m1,m2),max(m3,m4));
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
RMQ_2D_init();
int q;
scanf("%d",&q);
while(q--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int mmd=RMQ_2D(x1,y1,x2,y2);
printf("%d",mmd);
if(mmd==mp[x1][y1]||mmd==mp[x2][y2]||mmd==mp[x2][y1]||mmd==mp[x1][y2]) puts(" yes");
else puts(" no");
}
}
return 0;
}
原文:http://blog.csdn.net/u012797220/article/details/19420061