青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

RMQ

RMQ

       定義:
            A[0...n-1]                   目標數組                         Log2[1...n]                  2為底i的對數

      算法目的:

              給定海量詢問區間,求解區間最值。
      算法核心思想:
            (只對最小值進行討論,最大值的話可以通過原數組求相反數再求最小值獲得)

              算法分兩步:1、預處理          2、詢問

              1) 預處理
                 f[i][j] 表示 [i, i + 2j - 1]這個區間內的最小值所在數的下標。

                     a) j = 0,顯然f[i][0] = i;

                     b) j > 0, 由于這個區間長度必定是2的倍數,所以它一定能夠拆成兩個長度一樣的子區間,即[i, i + 2j-1 - 1][i + 2j-1, i + 2j - 1],仔細觀察可以發現:

                            f[i][j-1] 表示的區間是 [i, i + 2j-1 - 1]

                            f[i + 2j-1][j-1] 表示的區間是 [i, i + 2j-1 - 1]

                     為了方便閱讀,令x = f[i][j-1],   y = f[i + 2j-1][j-1],所以f[i][j] = A[x] < A[y] ? x : y;

              2) 詢問
                 詢問的時候可以把原區間[l, r]拆成兩個長度為2k的區間(區間之間允許有交),分別用f[l][k] f[r-2k+1][k]表示兩個區間內最小值所在的下標。并且k取值要求能夠使得 [l, l+2k-1] [r-2k+1,r] 的并集 [l, r]

                     于是 k為滿足l+2k-1 <= r并且值最大,即2k <= r-l+1,則k <= log2(r-l+1), k為整數,所以klog2(r-l+1)的下取整,由于1 <= r-l+1 <= n

                     x = f[l][k],   y = f[r-2k+1][k],詢問結果為:A[x] < A[y] ? x : y;

       算法復雜度:

              預處理:O( n log(n) )

              詢問:O(1)

       給出我的模板:

 1 #define MAXN 50010
 2 #define MAXL 16
 3 #define MAXQ 200100
 4  
 5  
 6 // 該RMQ模板只用于求最小值,若要求最大值只需要將原數組取相反數,然后結果再取相反數即可
 7  
 8 class RMQData {
 9 public:
10        int index;
11        int val;
12 }rd[MAXN];
13  
14 int n;
15 int Log2[MAXN];         // Log2[i] = log2(i)
16 int f[MAXN][MAXL];    // f[i][j] 表示 [i, (i + 2^j) - 1]這個區間的最小值 對應數的下標
17                               // f[i][j] = min{ f[i][j-1] , f[ i + 2^(j-1) ][j-1] }
18  
19 void RMQ_Init() {
20        int i, j, p;
21  
22        // 計算log以2為底的i的對數 log2(i)
23        Log2[1] = 0;
24        for(i = 2; i < n; i++) {
25               Log2[i] = Log2[i-1];
26               if( 1<<(Log2[i] + 1) == i ) {
27                      Log2[i] ++;
28               }
29        }
30        for(j = 0; j < MAXL; j++) {
31               for(i = 0; i < n; i++) {
32                      if(j == 0) {
33                             f[i][0] = i;
34                      }else {
35                             f[i][j] = f[i][j-1];
36                             p = i + (1<<(j-1));
37                             if(p < n) {
38                                    if( rd[ f[p][j-1] ].val < rd[ f[i][j] ].val ) {
39                                           f[i][j] = f[p][j-1];
40                                    }
41                             }                         
42                      }
43               }
44        }
45 }
46  
47 // 詢問的時候拆成兩個長度為2^k的區間
48 // f[l][k] 和 f[r-2^k+1][k]
49 // 并且k的取值要求能夠使得 [l,l+2^k-1] 和 [r-2^k+1,r] 的并集 為 [l, r]
50 // 于是 k為滿足l+2^k-1 <= r并且值最大,即2^k <= r-l+1
51 // k <= log2(r-l+1), 又k為整數,所以k為log2(r-l+1)的下取整
52 int RMQ_Query(int l, int r) {
53        if(l > r) {
54               int tmp = l;
55               l = r;
56               r = tmp;
57        }
58        int k = Log2[r - l + 1];
59        return rd[ f[l][k] ].val < rd[ f[r-(1<<k)+1][k] ].val ? f[l][k] : f[r-(1<<k)+1][k];
60 }

 

PKU 3264 Balanced Lineup

       RMQ,求解區間最大最小值的差。


PKU 3368 Frequent values

       題意:給定一個長度為N(N <= 100000)的單調不降序列Si,然后是Q(Q <= 100000)條詢問,問給定區間出現最多的數的次數。

       題解:離散化 + RMQ

    由于Q很大,詢問的復雜度必須要log(n),這樣一來就先確定下來是線段樹了,這個題目有個限制條件,所有數都是單調不增的排列的,換言之,就是說如果兩個數相同的話,他們之間的所有數必定也和它們相同。于是就有了O(Q log(n))(RMQ就是O(Q))的算法:

       對于所有的數均設定一個組號,也可以叫離散化吧,相同的數有相同的組號,然后將各個數的頻率統計后記錄在一個數組中,表示該類數的大小,對于輸入的詢問[x, y],直接查詢它們在哪個組,分三種情況討論:

       1) 如果xy在一個組,那么最長長度就是y - x + 1

       2) 如果組號相差1,那么找出兩者的分界點z(假設z點和x點組號相同),那么答案就是Max{z - x + 1, y - z}

       3) 如果相差大于1,那么先將兩頭截掉,統計大的記錄,再和中間那段的最大值比較大小,中間那段的最大值可以用線段樹 或者 RMQ區間查詢最值。

       本題還有線段樹的解法,代碼見:

       http://www.shnenglu.com/menjitianya/archive/2011/03/29/142966.html

 

PKU 2452 Sticks Problem

      題意:給定一個長度為N(N <= 50000)的數列Si,要求找到SiSj(1 <= i < j <= N)使得所有的Sk(i < k < j)大于Si并且小于Sj。如果能找到這樣的對數,輸出最大的j-i,否則輸出-1
      題解:二分 + RMQ(或線段樹)

      首先考慮最暴力的情況,自然是枚舉ij,然后判i+1j-1這些數是否滿足條件,如果滿足則更新j-i,這樣的復雜度是O(n3)的,時間上顯然說不過去。然后試著降掉一維,同樣枚舉ij,然后在判斷是否滿足條件時,利用RMQ求區間最值,這樣的復雜度就降到了O(n2logn),然而N的數據量還是不允許我們這么做,于是只能試著尋找O(n logn)的算法。那么我們嘗試枚舉一個j,看看能不能通過它來確定i,這里有一條很明顯的性質,就是如果SiSj-1都小于Sj那么Si+1Sj-1必然也都小于Sj,這條性質可以讓我們二分枚舉i的左邊界t,采用二分找到最小的t使得St-1 >= Sj,也即St < Sj(t <= i < j),找的過程可以采用RMQ求出區間最大值進行比較,然后問題就轉化成了在以下數列:St St+1 ... Sj-1 Sj 中找到最小的i(t <= i < j)使得Si+1Sj都大于Si,很明顯,又是一個區間最值的問題,利用RMQ求出[t, j-1]最小值的下標,就是我們要求的i,如果有多個,必須選擇最靠近j的,這是顯然的。這樣總的復雜度就降到O(n(logn)2)

       當然,求最值的時候可以采用線段樹代替RMQ

       線段樹的代碼見:

       http://www.shnenglu.com/menjitianya/archive/2011/03/29/142962.html


ZJU 2859 Matrix Searching

       題意:給定一個n*n(n <= 300)的矩陣,然后是(T <= 106)次詢問,每次詢問某個子矩陣中的最小值。

       題解:二維RMQ( 二維線段樹)

      裸模板題。思想和一維RMQ一樣,二維情況的f數組是四維的。

      線段樹的代碼見:

       http://www.shnenglu.com/menjitianya/archive/2011/03/30/143010.html

 

PKU 2637 WorstWeather Ever

      題意:給定N(N <= 50000)條信息,表示第yi年的降水量是ri,然后給出M(M <= 10000)條詢問,每條詢問的格式是Y X,表示自從第Y年以來X這一年是最大的降水量,問這句話正確與否。

      正確的判斷條件是:

            1.YX這些年的所有年份的降水量已知。

            2.Y的降水量 >= X的降水量。

            3.對于每個ZY < Z < XZ的降水量小于X的降水量。

      可能正確的判斷條件是:

            其中有一年的降水量不知道。

      錯誤的判斷條件是:

            其他情況。

       題解:二分 + RMQ

       邏輯強題。首先記錄下每個信息所在的連續塊,如果兩個信息的連續塊相同,說明它們之間的年份全部連續。年份的查找可以采用二分查找,然后就是分情況討論了,對輸入的兩個年份YX,利用二分查找找到最大的小于等于給定年份的那條記錄fYfX

       .如果兩者查到的記錄都在輸入數據中出現過,然后判斷他們是不是屬于一個連續的塊,只需要下標索引即可,然后是兩種情況:

           1. 如果屬于同一個連續塊,說明中間的年份全部出現過,然后利用線段樹查找fY的年份的最大降水量Yr[fY+1, fX-1]的最大降水量ZrfX的最大降水量Xr,如果滿足以下條件:(Yr >= Xr && Zr < Xr)則說明條件屬實,是true的情況,否則則是false

           2.如果不屬于同一個連續塊,說明中間的年份不是全部出現過,然后利用RMQ查找fY的年份的最大降水量Yr[fY+1, fX-1]的最大降水量ZrfX的最大降水量Xr,如果滿足以下條件:(Yr >= Xr && Zr < Xr)則說明當前條件屬實,但是也有可能沒出現過的記錄破壞這個條件,所以是maybe的情況,否則則是false

       .如果X能夠查到,則利用線段樹查找[fY+1, fX-1]的最大降水量ZrfX的最大降水量Xr,如果滿足以下條件:Zr < Xr則說明條件有可能屬實,是maybe的情況,否則則是false

       .如果Y能查到,這個條件就比較隱秘了,因為需要滿足(Yr >= Xr && Zr < Xr),而ZrXr無從得知,但是我們可以知道Yr >= Xr > Zr,于是只要判斷當前的Zr是否小于Yr

如果成立,則是maybe,否則就是false

       .最后一種情況就是XY的年份在先前的數據中都沒有出現過,這肯定是maybe的情況。


PKU 2201 Cartesian Tree

       題意:給定N(N <= 50000)個整數對(key, a),要求將他們組織成一棵樹二叉樹,并且對于樹的任意一個結點,滿足如下兩個性質:

       1) 當前結點的a值大于它父節點的a(小頂堆的性質)

       2) 當前結點的key值大于左子樹的key值,并且小于右子樹的key(排序二叉樹的性質)

       題目保證所有的key值和a值都不同。

       題解:首先將所有整數對按key值遞增排序,這樣我們只需要對數組進行切分,如果第t個結點作為根結點,那么[1, t-1]必定是它的左子樹集合,[t+1, N]必定是它的右子樹集合,這樣就能夠保證第二個條件,而第一個條件需要滿足父節點的a值小于左右子樹的a值,所以第t個結點必定是所有數中a值最小的,于是可以規約出一個遞歸算法,對于當前區間[l, r],找到區間內a值最小的作為根結點,然后將它左邊的區間和右邊的區間進行相同的遞歸運算。初始區間為[1, N],當[l, r]滿足 l > r即為遞歸出口。求區間最小值可以采用RMQ

       總的時間復雜度為排序的時間復雜度O(N log N)


posted on 2014-06-26 16:35 英雄哪里出來 閱讀(4118) 評論(0)  編輯 收藏 引用 所屬分類: 算法專輯

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            狠狠色狠狠色综合日日91app| 午夜精品久久久99热福利| 亚洲美女精品成人在线视频| 国产自产v一区二区三区c| 亚洲伦理在线免费看| 91久久黄色| 久久久久久久91| 久久精品人人做人人综合| 国产精品成人av性教育| 亚洲国产日韩欧美| 韩国三级在线一区| 午夜视频在线观看一区二区三区| 一区二区三区欧美亚洲| 欧美α欧美αv大片| 模特精品裸拍一区| 樱桃成人精品视频在线播放| 午夜在线精品偷拍| 久久国产精品久久久久久电车| 欧美视频在线一区| 一区二区三区高清| 亚洲性线免费观看视频成熟| 欧美女人交a| 亚洲免费成人| 亚洲一区二区精品在线| 欧美三级电影一区| 一本大道久久精品懂色aⅴ| 一本久道久久综合狠狠爱| 欧美激情精品久久久久久免费印度| 欧美成人国产| 亚洲精品一区二区三| 欧美黄免费看| 亚洲美女区一区| 亚洲亚洲精品在线观看| 国产精品夜夜夜一区二区三区尤| 亚洲香蕉在线观看| 久久精品123| 在线日本成人| 欧美激情一区二区三区在线视频观看| 亚洲大胆美女视频| 一本不卡影院| 国产乱码精品| 久久xxxx| 亚洲国产精品久久久久秋霞影院| 亚洲精品资源| 国产精品国产三级国产专播精品人 | 亚洲一区二区毛片| 欧美一区免费视频| 精品91免费| 欧美高清在线| 亚洲一区二区三区涩| 久久夜色精品一区| 99av国产精品欲麻豆| 国产精品二区三区四区| 欧美一区日本一区韩国一区| 欧美顶级艳妇交换群宴| 亚洲手机在线| 韩日欧美一区| 欧美日本一区二区视频在线观看| 亚洲视频在线一区| 欧美 亚欧 日韩视频在线| 99综合视频| 国户精品久久久久久久久久久不卡| 另类综合日韩欧美亚洲| 一区二区欧美在线观看| 久久夜色精品国产噜噜av| 一本色道久久综合亚洲精品不| 国产伦精品一区二区三区四区免费| 久久蜜桃资源一区二区老牛| 一区二区三区欧美在线| 男人天堂欧美日韩| 午夜精品www| 亚洲精品免费在线| 国产一区二区三区免费不卡| 欧美日韩xxxxx| 久久综合九色综合欧美就去吻 | 亚洲欧美99| 亚洲精品久久久久久一区二区| 欧美中文字幕视频| 99香蕉国产精品偷在线观看| 一区免费视频| 国产欧美一区二区精品秋霞影院| 欧美一区二区三区视频免费| 午夜伦欧美伦电影理论片| 韩国福利一区| 国产精品系列在线| 国产精品美腿一区在线看| 欧美成人免费小视频| 久久综合伊人77777麻豆| 欧美国产精品v| 亚洲精品美女91| 国产精品xvideos88| 久久噜噜噜精品国产亚洲综合| 久久人人97超碰精品888| 99在线热播精品免费99热| 亚洲欧美卡通另类91av | 国产精品综合久久久| 欧美激情一区二区三区四区| 欧美日韩精品久久| 久久一区二区三区超碰国产精品| 欧美日韩在线视频观看| 欧美大片91| 国产色综合网| 欧美特黄一区| 欧美亚洲免费| 亚洲欧美日韩一区| 亚洲国产专区| 日韩视频在线观看免费| 亚洲永久视频| 在线成人av| 国产日韩欧美在线播放不卡| 久久久久99精品国产片| 一本色道久久88综合日韩精品 | 亚洲视频精选| 中日韩在线视频| 欧美日韩伦理在线免费| 洋洋av久久久久久久一区| 亚洲乱码视频| 欧美日韩免费观看一区| 91久久精品美女| 日韩一区二区精品| 欧美久久电影| 这里只有精品视频| 欧美亚洲综合久久| 亚洲第一在线综合网站| 免费视频久久| 在线视频亚洲一区| 久久九九热re6这里有精品| 伊人久久久大香线蕉综合直播| 老司机午夜精品| 日韩视频中文字幕| 久久中文欧美| 宅男噜噜噜66国产日韩在线观看| 国产精品一区久久久| 久久综合网络一区二区| 宅男噜噜噜66国产日韩在线观看| 久久久久高清| 欧美一级片在线播放| 亚洲毛片在线观看.| 久热综合在线亚洲精品| 欧美淫片网站| 欧美一区二区三区免费视频| 99国产精品视频免费观看| 亚洲欧洲一区二区三区久久| 欧美11—12娇小xxxx| 久久嫩草精品久久久精品一| 亚洲视频在线观看网站| 一区二区三区四区五区精品| 亚洲精品久久久久久一区二区| 亚洲成人自拍视频| 在线免费观看日韩欧美| 在线日韩av片| 99re这里只有精品6| 亚洲精品日韩一| 亚洲午夜精品| 欧美一级专区免费大片| 欧美一区二区私人影院日本| 亚洲欧美日韩一区二区三区在线观看 | 香蕉久久夜色精品国产使用方法| 日韩午夜在线| 午夜亚洲性色视频| 久久精品亚洲一区| 免费亚洲网站| 一区二区三区成人| 久色成人在线| 国产精品日韩欧美一区二区| 国产精品亚洲第一区在线暖暖韩国| 国产日韩欧美不卡| 亚洲免费福利视频| 久久亚洲欧美国产精品乐播| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 最新国产成人在线观看| 欧美成人精品不卡视频在线观看| 国产日韩免费| 久久五月激情| 欧美成人a视频| 日韩视频在线观看一区二区| 亚洲高清不卡| 欧美日韩视频不卡| 亚洲欧美久久| 久久精品91久久香蕉加勒比| 黑人巨大精品欧美黑白配亚洲| 久久aⅴ乱码一区二区三区| 日韩午夜三级在线| 欧美图区在线视频| 亚洲图片激情小说| 亚洲视频免费观看| 国产精品视频专区| 午夜精品一区二区三区在线视| 亚洲最新在线| 欧美另类videos死尸| 日韩亚洲欧美一区二区三区| 欧美国产在线电影| 免费在线欧美黄色| 91久久精品www人人做人人爽| 男同欧美伦乱| 免费亚洲电影| 中文欧美日韩| 一区二区三区你懂的| 国产麻豆视频精品| 久久久无码精品亚洲日韩按摩|