區(qū)間---RMQ區(qū)間最值查詢

RMQ區(qū)間最值查詢浪藻,對于長度為n的數組A[]戏仓。
RMQ(i,j),返回數組A區(qū)間[i , j]內的最大值或最小值扒最。

思路:

ST算法:
O(nlogn)預處理,O(1)查詢
定義dp[i][j]表示從第i個數起連續(xù)2^j個數中(即區(qū)間[i...i+2^j-1])的最值
A={0,1,2,3},dp[0][1]=1,dp[0][2]=3.這里求最大值
初始化dp[i][0] = A[i]
轉移方程:dp[i][j] = max(dp[i][j-1], dp[i+2^(j-1)][j-1])
查詢:如果查詢區(qū)間[i,j]內的最值华嘹,先求區(qū)間長度為j-i+1
k = log2(j-i+1)吧趣,則RMQ(i,j) = max(dp[i][k], dp[j-(2^k)+1][k])

#include <iostream>
using namespace std;
namespace RMQ{
    int *A;
    int dp[100][10];//第二維大小log2(n)就行
    void init(int n){//數組長度
        for(int i=0; i<n; i++){
           dp[i][0] = A[i]; 
        }
        for(int j=1; (1<<j)<=n; j++){
            for(int i=0; i+(1<<j)-1<n; i++){
                dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
            }
        }
    }
    int query(int l, int r){
        int k=0;  //k=log2(r-l+1)
        while((1<<k+1) <= r-l+1) k++;
        return max(dp[l][k] ,dp[r-(1<<k)+1][k]);
    }
}
int main(){
     int data[] = {3 ,2 ,4 ,5 ,6 ,8 ,1 ,2 ,9 ,7};
     RMQ::A=data;
     RMQ::init(10);
     cout<<RMQ::query(0,9)<<endl;//3....7 -> 9
     cout<<RMQ::query(1,1)<<endl;//2 -> 2
     cout<<RMQ::query(4,6)<<endl;//6 8 1 -> 8
     return 0;
}

例題

POJ3264
題目大意:
第一行輸入 n,q 表示一個長度為n的數列,q組詢問
接下來n行 每行一個整數表示數列內容
接下來q行 每行一個l r 表示一個區(qū)間
輸出每個區(qū)間內 最大值 減去 最小值 是多少

Sample Input
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3
0

ac代碼

#include <iostream>
#include <stdio.h>
using std::max;
using std::min;
namespace RMQ{
    int *A;
    int dp[50000][32];
    int dp2[50000][32];
    void init(int n){//數組長度
        for(int i=0; i<n; i++){
           dp[i][0] = A[i];
           dp2[i][0] = A[i];
        }
        for(int j=1; (1<<j)<=n; j++){
            for(int i=0; i+(1<<j)-1<n; i++){
                dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
                dp2[i][j] = min(dp2[i][j-1], dp2[i+(1<<(j-1))][j-1]);
            }
        }
    }
    int query(int l, int r){
        int k=0;  //k=log2(r-l+1)
        while((1<<k+1) <= r-l+1) k++;
        return max(dp[l][k] ,dp[r-(1<<k)+1][k])-min(dp2[l][k] ,dp2[r-(1<<k)+1][k]);
    }
}
int data[50000];
int main(){
    int n,q;
    scanf("%d %d",&n,&q);
    for(int i=0;i<n;++i){
        scanf("%d",&data[i]);
    }
    RMQ::A=data;
    RMQ::init(n);
    int l,r;
    while(q--){
        scanf("%d %d",&l,&r);
        printf("%d\n",RMQ::query(l-1,r-1));
    }
     return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末耙厚,一起剝皮案震驚了整個濱河市强挫,隨后出現的幾起案子,更是在濱河造成了極大的恐慌薛躬,老刑警劉巖俯渤,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異型宝,居然都是意外死亡八匠,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門趴酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梨树,“玉大人,你說我怎么就攤上這事岖寞÷账模” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵慎璧,是天一觀的道長床嫌。 經常有香客問我,道長胸私,這世上最難降的妖魔是什么厌处? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮岁疼,結果婚禮上阔涉,老公的妹妹穿的比我還像新娘缆娃。我一直安慰自己,他們只是感情好瑰排,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布贯要。 她就那樣靜靜地躺著,像睡著了一般椭住。 火紅的嫁衣襯著肌膚如雪崇渗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天京郑,我揣著相機與錄音宅广,去河邊找鬼。 笑死些举,一個胖子當著我的面吹牛跟狱,可吹牛的內容都是我干的。 我是一名探鬼主播户魏,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼驶臊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叼丑?” 一聲冷哼從身側響起关翎,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幢码,沒想到半個月后笤休,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡症副,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了政基。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞铣。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沮明,靈堂內的尸體忽然破棺而出辕坝,到底是詐尸還是另有隱情,我是刑警寧澤荐健,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布酱畅,位于F島的核電站,受9級特大地震影響江场,放射性物質發(fā)生泄漏纺酸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一址否、第九天 我趴在偏房一處隱蔽的房頂上張望餐蔬。 院中可真熱鬧,春花似錦、人聲如沸樊诺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽词爬。三九已至秃嗜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿膨,已是汗流浹背锅锨。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虽惭,地道東北人橡类。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像芽唇,于是被迫代替她去往敵國和親顾画。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容