Cornfields
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 7963 | Accepted: 3822 |
Description
FJ has, at great expense, surveyed his square farm of N x N hectares (1 <= N <= 250). Each hectare has an integer elevation (0 <= elevation <= 250) associated with it.
FJ will present your program with the elevations and a set of K (1 <= K <= 100,000) queries of the form "in this B x B submatrix, what is the maximum and minimum elevation?". The integer B (1 <= B <= N) is the size of one edge of the square cornfield and is a constant for every inquiry. Help FJ find the best place to put his cornfield.
Input
* Lines 2..N+1: Each line contains N space-separated integers. Line 2 represents row 1; line 3 represents row 2, etc. The first integer on each line represents column 1; the second integer represents column 2; etc.
* Lines N+2..N+K+1: Each line contains two space-separated integers representing a query. The first integer is the top row of the query; the second integer is the left column of the query. The integers are in the range 1..N-B+1.
Output
Sample Input
5 3 1
5 1 2 6 3
1 3 5 2 7
7 2 4 6 1
9 9 8 6 5
0 6 9 3 9
1 2
Sample Output
5
Source
分析:
二维$RMQ$模板题。
就是模板,但是卡空间是真恶心。。。卡了一个小时。
Code:
//It is made by HolseLee on 4th Sep 2018
//POJ 2019
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N=;
int mi[N][N][][];
int ma[N][N][][]; void ready(int n)
{
for(int i=; (<<i)<=n; ++i)
for(int j=; (<<j)<=n; ++j) {
if( i== && j== ) continue;
for(int line=; line+(<<i)-<=n; ++line)
for(int ray=; ray+(<<j)-<=n; ++ray) {
if( i ) {
mi[line][ray][i][j]=min(mi[line][ray][i-][j],mi[line+(<<(i-))][ray][i-][j]);
ma[line][ray][i][j]=max(ma[line][ray][i-][j],ma[line+(<<(i-))][ray][i-][j]);
} else {
mi[line][ray][i][j]=min(mi[line][ray][i][j-],mi[line][ray+(<<(j-))][i][j-]);
ma[line][ray][i][j]=max(ma[line][ray][i][j-],ma[line][ray+(<<(j-))][i][j-]);
}
}
}
} int quary(int x,int y,int X,int Y)
{
int kx=,ky=,m1,m2,m3,m4,minn,maxx;
while( (<<(kx+))<=X-x+ ) kx++;
while( (<<(ky+))<=Y-y+ ) ky++; minn=min(min(mi[x][y][kx][ky],mi[X-(<<kx)+][Y-(<<ky)+][kx][ky]),min(mi[X-(<<kx)+][y][kx][ky],mi[x][Y-(<<ky)+][kx][ky])); maxx=max(max(ma[x][y][kx][ky],ma[X-(<<kx)+][Y-(<<ky)+][kx][ky]),max(ma[X-(<<kx)+][y][kx][ky],ma[x][Y-(<<ky)+][kx][ky])); return maxx-minn;
} int main()
{
int n,B,m;
while( scanf("%d%d%d",&n,&B,&m)== && n && B &&m ) {
int x,y;
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j) {
scanf("%d",&x);
mi[i][j][][]=ma[i][j][][]=x;
}
ready(n);
while( m-- ) {
scanf("%d%d",&x,&y);
int ans=quary(x,y,x+B-,y+B-);
printf("%d\n",ans);
}
}
return ;
}