아 ...
주제 링크 : https://www.luogu.com.cn/problem/P3865
아이디어 승산기를 사용 ST (스파 스 테이블) 알고리즘.
최소값 - 우리는 F [I 1, I + 2 ^ (K)]의 간격을 나타내는 [I] [K] 배열하자.
물론 재귀가 있습니다 :
F는 [I]이 [ 0 ] = A [I]; F는 [I] [j]가 최대 (F [I] [J- = 1 , F를 [I + ( 1 << (J - 1 )) [J = 1 ];
검색어 :
인터벌 [L, R는, K =은 log2 (L + R-1)을 얻을 수있다. 다음 [L] f를 사용할 수 [K]와 F [R-2 ^ J + 1] [J], 즉 최대 답변 = 최대 (F [1] [K], F [R-을주는 범위 다루 (1 << j)를 +1] [K])
AC 코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #INCLUDE <cstdio> 2 #INCLUDE <cmath> 3 #INCLUDE <iostream> 4 5 이용 스페이스 성병; 6 INT N, m; 7 의 INT 이 [ 100005 ], 세인트 [ 100,500 ] [ 25 ]; 8 9 INT의 주 () { 10 는 scanf ( " % D % D " , 및 N, m); 11 대 ( INT 나 = 1 ; i가 <= N; I ++) {는 scanf ( " %의 D ' , A [I]); ST는 [I]이 [ 0 ] = A [I]는} 12 대 ( INT J = 1 ; J <=은 log2 (N) J ++ ) { 13 대 ( INT 난 = 1 , I + ( 1 << j)를 - 1 <= N; I ++ ) { 14 일 [I] [J = 최대 (세인트 [I] [J = 1 , 세인트 [I + ( 1 << (J - 1 )) [J = 1 ]); 15 } 16 } 17 대 ( INT 나 = 1 ; i가 <= m; I ++ ) { 18 INT의 L, R; 19 는 scanf ( " % D % D ", L, R); 20 INT K =은 log2 (L + R- 1 ); 21 의 printf ( " % D \ n " 맥스 (세인트 [L] [K], 세인트 [R- ( 1 << k)는 + 1 ] [K])); 22 } 23 반환 0 ; 24 }