問題の説明
毎日搾乳のために、ファーマージョンのNの牛(1≤ N 50,000≤)は常に同じ順序で並べます。ある日ファーマージョンは牛のいくつかとフリスビーのゲームを整理することを決定します。物事をシンプルに保つために、彼はゲームをプレイするために搾乳ラインナップから牛の連続した範囲がかかります。しかし、楽しみを持っているすべての牛のために、彼らは高さがあまり異なってはなりません。
ファーマージョンはリストにしたQ(1つの≤ Q ≤20万)牛やその高さ(1つの≤の潜在的なグループ高さ ≤1,000,000)。各グループのために、彼はあなたの助けが最短とグループで最も高い牛の高さの差を決定したいと考えています。
入力
1行目:二スペースで区切られた整数、
N
および
Q
。
行2 .. N +1:ライン I +1は、牛の高さは、単一の整数が含ま I
線 N 2 ... N + Q +1:二つの整数 A と B (1≤ A ≤ B ≤ N )、牛の範囲を表す に Bインクルーシブ。
行2 .. N +1:ライン I +1は、牛の高さは、単一の整数が含ま I
線 N 2 ... N + Q +1:二つの整数 A と B (1≤ A ≤ B ≤ N )、牛の範囲を表す に Bインクルーシブ。
出力
行1 ..
Q
:各行は、応答に対応し、範囲内の最も高いと最短牛の高さの差を表す単一の整数を含んでいます。
サンプル入力
6 3 7 1 2 3 4 5 1〜5 4 6 2 2
サンプル出力
6 3 0
************************************************** ************************************************** *******************************
DP [I] [j]が取得された間隔(I、I + 2 ^ J-1)最も値を示します。
最も値DPは利点、それぞれ配列DPに格納された最も値を有する場合
STアルゴリズム主な利点は、時間のかかるクエリはO(1)です。
************************************************** ************************************************** *******************************
1の#include <iostreamの> 2の#include < ストリング > 3の#include <CStringの> 4の#include <cmath> 5の#include <キュー> 6の#include <積層> 7の#include <地図> 8の#include <cstdioを> 9 使用 名前空間はstd; 10 INTの牛[ 51001 ]。 11 int型N、M、P。 12 INT DPMAX [ 51001 ] [ 51 ]、DPMIN [ 51001 ] [ 51 ]。 13 ボイド maxmp(int型N) 14 { 15 のためには、(int型、それは= 1 ;それ<= N;それ++ ) 16 DPMAX [それ] [ 0 ] = 牛[それ]。 17 のためには、(int型、それは= 1 ;それ<=(ログ((二重)N)/ログ(2.0));それ++ ) 18 のための(INT JT = 1 ; JT +(1 << IT) - 1 <= N; JT ++ ) 19 DPMAX [JT] [それ] = MAX([JT] [IT- DPMAX 1 ]、DPMAX [JT +(1 <<(IT- 1))] [IT-1 ])。 20 } 21 22 空隙 minmp(int型N) 23 { 24 のための(int型、それは= 1 ;それ<= N;それ++ ) 25 DPMIN [それ] [ 0 ] = 牛[それ]。 26 のためには、(int型、それは= 1 ;それ<=(ログ((二重)N)/ログ(2.0));それ++ ) 27 のための(INT JT = 1 ; JT +(1 << IT) - 1 <= N; JT ++ ) 28 DPMIN [JT] [それ] =分(DPMIN [JT] [IT- 1 ]、DPMIN [JT +(1 <<(IT- 1))] [IT- 1 ])。 29 } 30 31 INT querymax(INT S、INT V) 32 { 33 のint、K =(INT)((ログ((ダブル)(V-S + 1))/ログ(2.0 ))); 34 リターン MAX(DPMAX [S] [k]は、DPMAX [N-(1 << K)+ 1 ] [K])。 35 } 36 37 int型 querymin(INT S、INT V) 38 { 39 のint、K =(INT)((((ログダブル)(V-S + 1))/ログ(2.0 ))); 40 リターン分(DPMIN [S] [k]は、DPMIN [N-(1 << K)+ 1 ] [K])。 41 } 42 43 のint main()の 44 { 45 46 ながら(〜のscanf(" %d個の%のD "、&N&P)) 47 { 48 のための(int型 i = 1 ; iが<= N; ++ I) 49 scanf関数(" %のD "、&牛[I])。 50 51 maxmp(N) 52 minmp(N) 53 一方(P-- ) 54 { 55個 のint S、V。 56 のscanf(" %D%dの"、&S、およびV)。 57 のprintf(" %d個の\ n "、querymax(S、V) - querymin(S、V))。 58 } 59 } 60 リターン 0 。 61 62 }
ます。https://www.cnblogs.com/sdau--codeants/p/3483738.htmlで再現