// 개념 3264
// O (N) N (로그)
//는 정적 데이터에 사용될 수 있고, 단지 최대 또는 최소 간격을 추구
. (1) #INCLUDE <cstdio> 2 #INCLUDE <cmath> . (3) #INCLUDE <iostream> . 4 #INCLUDE <알고리즘> . (5) 은 USING 공간 STD] . 6 . 7 CONST의 INT MAXN = 5E4 + 5. ; . 8 . 9 INT의 N, m; // 수 n m 쿼리 10 INT ]이 [MAXN] . 11 INT MAXN는 [MAXN] [ 32 ]; // F는 [I]은 [J]가 i 번째 자리 간격 [최대 값으로부터 시작하여 번호 2 ^ J를 나타낸다을 I, I + . (J << 1) -1] (12)는 INT 미네소타 [MAXN] [ 32 ] 13은 14 무효 ST () { (15) 에 대한이 ( int로 I = 1 ; i가 <= N; ++ I) maxn가 [I]이 [ 0 ] = 미네소타가 [I]이 [ 0 ] = A [I]; 16 INT의 m = ( INT )은 log2 (N * 1.0 ) / LOG2 ( 2 * 1.0 ); 17 대 ( INT의 J = 1 ; J <= m; ++ j)에 { 18 대 ( int로 = 1을 1 ] I + ( 1 << j)를 - 1 <= N; ++ I) { 19 maxn [I] J = 최대 (maxn [I] [J = 1 , maxn [I + ( 1<< (J- 1 )) [J- 1 ]); (20) 에 의해이 [I]은 [J]를 분 = (A [i]를 [J- 1 ], A [I + ( 1 << (J- 1 )) [J- 1 ]); 21 } 22 } 23 } 24 25 에게 질의 ( 당신이 로 는 R) { 26 하면 K = 2 로그 (R-L + 1 ) / 2 로그 ( 2 ); 27 리턴 맥스 (maxn [I] [K] maxn [R- ( 1 << k)는 + 1 ] [A]) - 행 (기준 [] [K], [R- ( 1 << k)를 + 1][케이]); 28 } 29 30 INT 의 main () { 31 는 scanf ( " %의 D % d에 " , N, m); (32) 에 대한이 ( int로 I = 1 ; i가 N = <++ {I) (33) 는 scanf ( " %의 D를 " , & A [I]); 34 } 35 ST (); 36 INT의 L, R; (37) 에 대한이 ( int로 I = 0 ; I = m의 단계;! ++ I) { 38 는 scanf ( " %의 D % d에 ", L, R); 39 의 printf ( " % D \ 없음 " 쿼리 (L, R)); 40 } 41 반환 0 ; 42 }
자세한 // 참조 https://blog.csdn.net/a_bright_ch/article/details/81062039