BZOJ-1978: [BeiJing2010]取数游戏 gam

作者: AmadeusChan | 来源:发表于2018-11-19 18:21 被阅读0次

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1978

    由于要搞最大公约数,那么就直接sqrt(a[i])枚举约数即可,然后开一个桶来优化一下,复杂度就成了O( n sqrt( a ) )

    代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
     
    using namespace std ;
     
    #define maxa 1001000
    #define maxn 50010
    #define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
     
    int Max[ maxa ] , f[ maxn ] , n , a[ maxn ] , ans = 0 ;
    int b[ maxn ] , bn , l ;
     
    int main(  ) {
        memset( Max , 0 , sizeof( Max ) ) ;
        memset( f , 0 , sizeof( f ) ) ;
        scanf( "%d%d" , &n , &l ) ;
        rep( i , n ) scanf( "%d" , a + i ) ;
        rep( i , n ) {
            bn = 0 ;
            int len = int( sqrt( a[ i ] ) ) ;
            rep( j , len ) if ( ! ( a[ i ] % j ) ) {
                b[ ++ bn ] = j ; 
                if ( a[ i ] / j != j ) b[ ++ bn ] = a[ i ] / j ;
            }
            rep( j , bn ) if ( b[ j ] >= l ) f[ i ] = max( f[ i ] , Max[ b[ j ] ] ) ;
            ans = max( ans , ++ f[ i ] ) ;
            rep( j , bn ) Max[ b[ j ] ] = max( Max[ b[ j ] ] , f[ i ] ) ;
        }
        printf( "%d\n" , ans ) ;
        return 0 ; 
    }
    

    相关文章

      网友评论

        本文标题:BZOJ-1978: [BeiJing2010]取数游戏 gam

        本文链接:https://www.haomeiwen.com/subject/uobafqtx.html