网址如下:
OpenJudge - 2019:Cornfields
唉,最近沉迷法环,都没怎么学习了
话说这题的名字让我想起了《星际穿越》了(玉米地呀玉米地)
这是翻译过后的版本,题目要求我们帮助FJ找到放置玉米地的最佳位置,但实际上我们只需要根据给出的查询,来给出最大值和最小值的差值就行了
但是注意到查询数K最大会有十万,所以我们不可能根据查询现查现算,很明显会TLE,除非你有一个方法可以瞬间得到子矩阵的最大值和最小值,我是没有想到啦
那转变一下思路,注意到B和N最大才250,我们只需要提前把答案设置好,供后面的查询就行了
方法就是设置一个二维数组,索引的坐标是子矩阵左上角的坐标,值是最大值和最小值。根据输入的数据不断更新这个矩阵就可以了,数据输入完,这个矩阵就是供查询的答案矩阵
代码如下:
#include<cstdio>
#include<algorithm>
const int maxn = 251;
struct Node{
int max, min;
Node():max(-1), min(251){}
}martix[maxn][maxn];
int N, B, K;
void update(int x, int y, int val){
int cnt_i = 0, cnt_j = 0;
for(int i = x; i && cnt_i < B; i--, cnt_i++)
for(int j = y; j && cnt_j < B; j--, cnt_j++){
martix[i][j].max = std::max(val, martix[i][j].max);
martix[i][j].min = std::min(val, martix[i][j].min);
}
}
int main(void)
{
scanf("%d%d%d", &N, &B, &K);
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++){
int val; scanf("%d", &val);
update(i, j, val);
}
while(K--){
int x, y; scanf("%d%d", &x, &y);
printf("%d\n", martix[x][y].max - martix[x][y].min);
}
return 0;
}