해결 RMQ (가장 값의 범위)에 ST 알고리즘 문제 (ST 테이블)

// 개념 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

추천

출처www.cnblogs.com/pupil-xj/p/11595456.html