루오 구 P3865 [템플릿] ST 테이블 (템플릿)

아 ...

 

주제 링크 : 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 코드 :

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 }
AC 코드

추천

출처www.cnblogs.com/New-ljx/p/12210090.html