ST表
ST表的构造与查询
构造
void ST_init ( ) {
for ( int i = 1 ; i <= n ; i++ )
f [ i ][ 0 ] = a [ i ] ;
for ( int j = 1 ; ( 1 << j ) <= n ; j++ )
for ( int i = 1 ; i <= n - ( 1 << j ) + 1 ; i++ )
f [ i ][ j ] = max ( f [ i ][ j - 1 ] , f [ i + ( 1 << j - 1 ) ][ j - 1 ] ) ;
}
查询
O(logn) :
int ST_RMQ ( int l , int r ) {
int L = r - l + 1 , ans = INT32_MIN ;
for ( int i = 0 , j = l ; ( 1 << i ) <= L ; i++ )
if ( ( l >> i ) & 1 ) {
ans = max ( ans , f [ i ][ j ] ) ;
j += ( 1 << i ) ;
}
return ans ;
}
O(1) :
int ST_RMQ ( int l , int r ) {
int k = log2 ( r - l + 1 ) ;
return max ( f [ l ][ k ] , f [ r - ( 1 << k ) + 1 ][ k ] ) ;
}

浙公网安备 33010602011771号