RMQ問題(超詳細な!!!)

I.はじめに

RMQは、特定の範囲内の最大値または最小値を依頼することで、最も激しい方法質問間隔で各サイクル、N、Q> 10000意志TLEの値を検索します。

RMQを解決する一般的な方法- STアルゴリズム

STアルゴリズムは、一般的な質問で最も範囲の値のいくつかを尋ねるために何度も使用されています。事前O(nlogn)aは、O(1)各お問い合わせにお答えするために行うことができます。

それは修正に適用され、より頻繁に(10 ^ 6レベル以上)の状況を求めないように、非STアルゴリズムの使用条件が変更されます。

長所:ショートコード、高効率、簡単な

短所:貧しい適用

二、STアルゴリズムの流れ

前処理:

ダイナミックプログラミングアルゴリズムのST原理は、実際に、我々は[1 ... n]を使用して数値のセットを表します。[I、J] fを設定表す[I] [I + 2J - 1]この範囲の最大は、[i]は連続2Jの開始の最大数です。要素の数は2Jので、2つの部分に平均中央、正確に一つの2J-1、即ち、F [I、J] Fに分割されている[I、J-1]の要素数の各部分であるので及びf [I + 2J-1、J-1]を、以下に示すように:

 

栗のために - 図に示すように。

全区間の最大値は、動的プログラミング最適化理論を満たすために、約2重量部の大きい方の最大値である必要があり、解析は、状態遷移方程式を得ます。

F [I] [J] = MAX(F [I]、[J - 1]、F [J。 - 1] [I + 2J- 1。])、境界条件であるF [i]が[0] = [I] 、アレイは、時間複雑性O(nlogn)A fを前処理することができるようになっています。

INT J = 1。 ; J <= LN; J ++ 

  のためのINT I = 1 ; I +(1 << J) - 1 <= N; I ++は

    F [I] [J] = MAX(F [I] [J- 。1 ]、Fは[Iは、+(1 <<(J- 1))] [J- 1 ]); // <<左シフト演算を、一定時間を最適化します

頼みます

我々は最大の区間[李、RI]をお願いしたい場合は、最初のxの最大値が満たす見つけるRI≤(xは2のべき乗である)2倍を-李+ 1、の導入のx =のLOG2(RI-LI + 1

その後、間隔[リチウム、RI] = [リチウム、リチウム2X + 1] U- [RI-2X + 1、RI] 下記のように:

ANS = MAX([X] [X]、[再2X +1] F [ザ] F)

两个区间的元素个数都为2x,所以[li, ri]的最大值为max(f[li][x], f[ri - 2x + 1][x]),可以在O(1)内计算出来。虽然这两个区间有交集,但是对于求区间最值来说没有影响,这就是ST算法只适用于求区间最值的原因。

技巧:

因为cmath库中的log2函数效率不高,所以除了调用log2函数外,通常还会使用O(N)递推预处理出1~N这N种区间长度各自对应的k值。具体地,设lg[d]表示log2d下取整,log2d=log2((d/2)*2)=log2(d/2) + 1则lg[d] = lg[d/2]+1

lg[0]=-1;//为了lg[1]=0;
for(int i=1;i<=n;i++)
    lg[i]=lg[i>>1]+1;// >> 右移运算符,优化时间常数

那么再来看一道例题吧——

1541:【例 1】数列区间最大值

【题目描述】

输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。

【输入】

第一行两个整数 N,M 表示数字的个数和要询问的次数; 接下来一行为 N个数; 接下来 M行,每行都有两个整数 X,Y。

【输出】

输出共 M行,每行输出一个数。

【输入样例】

10 2

3 2 4 5 6 8 1 2 9 7

1 4

3 8

【输出样例】

5

8


 

 

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/ljy-endl/p/11331921.html