请问这道PASCAL题属于什么类型?

来源:百度知道 编辑:UC知道 时间:2024/05/09 13:59:55
给出N个数
然后给出M个询问
每个询问给出两个数L、R
输出L到R之间最大的数
这种类型的题目怎么做

这个。。
对ls不做评价。。
显然。。这个问题用RMQ才可以完美解决。。
所谓RMQ,其英文是Range Minimum/Maximum Query,也就是区间段的最大最小值,可以认为是给定数组A,然后给出M个区间(i,j)询问该区间的最大或最小值。。
主要方法及复杂度如下:
1.朴素 O(n)-O(n) online
2.线段树 O(n)-O(qlogn) online
3.ST(动态规划) O(nlogn)-O(1) offline
ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k是满足2^k<=b-a的最大的k,即k=[ln(b-a+1)/ln(2)]
d的求法可以用动态规划,d[i,j]=max(d[i,j-1],d[i+2^(j-1),j-1])
代码如下
Read(n, q);
for i := 1 to n do
Read(d[i, 0]);
for j := 1 to Trunc(Ln(n) / Ln(2)) do
for i := 1 to n - 1 shl j + 1 do
d[i,j] := Max(d[i,j-1], d[i+1 shl (j-1),j-1]);
for i := 1 to q do
begin
Read(a, b);
k := Trunc(Ln(b - a + 1) / Ln(2));
rmq := Max(d[a, k], d[b - 1 shl k + 1, k]);
Writeln(rmq);
end;
RMQ(Range Minimum/Maximum Query)问题是求区间最值问题。你当然可以写个O(n)的(怎么写都可以吧=_=),但是万一要询问最值1000000遍,估计你就要挂了。这时候你可以放心地写一个线段树(前提是不