명세서 알고리즘 균형 라인업 RMQ (제 1 시간)

문제 설명

매일 착유를 들어, 농부 존의 N의 소 (1 ≤ N 50,000 ≤)은 항상 같은 순서로 정렬. 어느 날 농부 요한은 젖소의 일부 궁극적 인 프리스비의 게임을 구성하기로 결정합니다. 간단하게하기 위해, 그는 게임을 착유 라인업에서 젖소의 연속 범위를 취할 것입니다. 모든 소는 재미를위한 그러나, 그들은 높이가 너무 많이 차이가 있습니다.

농부 존 목록 만들었다 Q (1 ≤ Q ≤ 200,000) 소와 그 높이 (1 개 ≤ 전위 그룹 높이 ≤ 1,000,000). 각 그룹에 대해, 그는 그룹에서 가장 짧고 가장 높은 소 사이의 높이 차이를 결정하기 위해 당신의 도움을 원한다.

 

 

입력
라인 1 : 두 개의 공간으로 분리 정수, N Q .
라인 2 .. N +1 : 광고 +1 암소의 높이가 단일 정수 포함 I
라인 N + 2 ... N + Q + 1 : 두 정수 B (1 ≤ BN ) 소에서의 범위를 나타내는 것은 하는 B 포함.
 

 

산출
라인 1 ... Q 각 라인이 응답에 대한 응답과 범위의 높은 및 최단 암소 사이의 높이 차이를 나타내는 하나의 정수를 포함한다.
 

 

샘플 입력
6 7 3 1 3 4 2 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  이용  네임 스페이스 표준;
10  INT의 소 [ 51001 ];
11  INT의 N, M, P;
12  의 INT dpmax [ 51001 ] [ 51 ] dpmin [ 51001 ] [ 51 ];
(13)  보이드 maxmp ( INTN)
 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]가 = 맥스 (dpmax [JT] IT- 1 ], [JT + (dpmax 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      리턴 맥스 (dpmax [S] [K] dpmax [V- ( 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 [V- ( 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 \ 없음 " , querymax (S, V) - querymin (S, V));
58          }
 59      }
 60      반환  0 ;
61  
(62) }
코드보기

 

HTTPS : //www.cnblogs.com/sdau--codeants/p/3483738.html 재현

추천

출처blog.csdn.net/weixin_33908217/article/details/93432895