一 问题描述
约翰正在寻找最平坦的土地种植玉米,他花了很大的代价调查它的 N*N 公顷方形农场。每公顷都有一个整数高度,有 K 组查询。整数 B 是方形田地的一个边长。查询 B*B 子矩阵中最大高度和最小高度的差值。
二 输入和输出
1 输入
第 1 行包含 3 个整数,N、B 和 K。第 2 到 N+1 行,每行都包含 N 个整数,代表 N*N 公顷每公顷的高度,每行的第 1 个整数都表示第 1 列,第 2 个整数都表示第 2 列。接下来的 K 行,每行都包含两个整数,分别表示查询子矩阵左上角和的行和列。
2 输出
对每个查询,都单行输出子矩阵中最大高度和最小高度的差值。
三 输入和输出样例
1 输入样例
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
2 输出样例
5
四 问题分析
本问题属于二维区间最值查询问题,可以使用 ST 解决,只不过增加了一维,且查询时需要注意区间问题。Fmax[k][i][j] 表示第 k 行[i,i+2^j-1]区间的最大值,区间长度为 2^j。
五 算法设计
1 求出数据范围内所有数的 log 值,将其存储在 lb[] 中。
2 将每个元素 a[k][k] 都存入 F[k][i][0] 中。
3 创建二维 ST。
4 从当前位置(x,y)开始,向右 B 列,向下