!-- Loading 底层遮罩 -->

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 ] ) ;
}
 

 

posted @ 2022-03-30 17:59  Thinker-X  阅读(34)  评论(0)    收藏  举报