算法训练营:海量图解+竞赛刷题(进阶篇)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

训练4 二维区间最值差

题目描述(POJ2019):约翰正在寻找最平坦的土地种植玉米。他花了很大的代价调查他的N×N公顷的方形农场(1≤N≤250)。每公顷都有一个整数高度(0≤高度≤250)。有K(1≤K≤100,000)组查询,整数B(1≤BN)是方形田地的一个边长,查询B×B子矩阵中最大高度和最小高度的差值。

输入:第1行包含3个整数NBK。第2..N+1行,每行都包含N个整数,代表N×N公顷每公顷的高度,每行的第1个整数都表示第1列,第2个整数都表示第2列。接下来K行,每行都包含两个整数(在1..N-B+1范围内),分别表示查询子矩阵左上角的行和列。

输出:对每个查询,都单行输出子矩阵中最大高度和最小高度的差值。

题解:本题属于二维区间最值查询问题,可以使用ST解决,只不过增加了一维,且查询时需要注意区间问题。Fmax[k][i][j]表示第k行[i, i+2j-1]区间的最大值,区间长度为2j

1. 算法设计

(1)求出数据范围内所有数的log值,将其存储在数组lb[]中。

(2)将每个元素a[k][i]都存入F[k][i][0]中。

(3)创建二维ST。

(4)从当前位置(x, y)开始,向右B列,向下B行,查询每一行的最大值和最小值,再求区间最大值和最小值。输出二维区间的最大值和最小值之差。

2. 算法实现