这取自TopCoder的算法页面 - 关于“RMQ的简单算法”一节 据说是用于计算A阵列上的RMQ的预处理功能。
void process1(int M[MAXN][MAXN], int A[MAXN], int N)
{
int i, j;
for (i =0; i < N; i++)
M[i][i] = i;
for (i = 0; i < N; i++)
for (j = i + 1; j < N; j++)
if (A[M[i][j - 1]] < A[j])
M[i][j] = M[i][j - 1];
else
M[i][j] = j;
}
但我不知道生成的M 2D数组如何有助于计算RMQ,我没有得到什么?
答案 0 :(得分:2)
提示
数组A[]
包含您为其计算RMQ的元素序列。数组M[][]
包含每个查询类型的答案“范围a..b中的最小元素是什么?”进入M[a][b]
。
完整答案
这样,您可以通过查看M[][]
中的相应元素,在常量时间内查找任何查询的答案。
计算方式如下:
i..i
的最小值分配给i
。这是因为单元素范围的最小值就是那个元素。i..k
的其他范围k > i
的RMQ答案。这是通过将已经计算的范围从i
一次扩展一个元素来完成的。