二维RMQ(Range Minimum Query)
先来看一维情形:
给定一个数组x以及大量的查询,查询内容是任意区间内的最小值,例如数组长度为n,则查询为从x[a]到x[b]中的最小值,0<=a<b<n, a, b 任意。
问题是如何进行预处理,使得每次查询时间为O(1)。
解法:计算出所有长度为2^i的区间的最小值,则任[a,b]区间可以拆为两个长度为2^i的区间的并集,i=log(b-a)。
例如查询1到100间的最小值,[1,64],[37,100]的最小值已知,则[1,100]的最小值,为这两者中的小者。
算法的空间和时间复杂度均为O(logN)
由此可以推演到二维情况,给一个n*n的矩阵,要查询任意子矩阵的最小值。
解法类似,计算出所有大小为2^i*2^j的子矩阵,然后查询时候,每个子矩阵可以看成是四个预处理矩阵的并集,查询时间仍然为O(1),而预处理的复杂度为O(N*N*logN*lonN)
典型的题目如zoj的2859题,
Given an n*n matrix A, whose entries Ai,j are integer numbers ( 1 <= i <= n, 1 <= j <= n ). An operation FIND the minimun number in a given ssub-matrix.
Input
The first line of the input contains a single integer T , the number of test cases.
For each test case, the first line contains one intege