문제 설명
매일 착유를 들어, 농부 존의 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 ≤ ≤ B ≤ N ) 소에서의 범위를 나타내는 것은 하는 B 포함.
라인 2 .. N +1 : 광고 나 +1 암소의 높이가 단일 정수 포함 I
라인 N + 2 ... N + Q + 1 : 두 정수 및 B (1 ≤ ≤ B ≤ N ) 소에서의 범위를 나타내는 것은 하는 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);
************************************************** ************************************************** *******************************
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 재현