美文网首页信息学竞赛题解(IO题解)
BZOJ-1007: [HNOI2008]水平可见直线

BZOJ-1007: [HNOI2008]水平可见直线

作者: AmadeusChan | 来源:发表于2018-10-16 20:42 被阅读0次

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

    按照斜率升序排序,然后用栈维护一下就可以了。。

    代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
     
    using namespace std ;
     
    #define MAXN 50010
     
    struct pos {
                int k , b , t ;
                bool operator < ( const pos x ) const {
                            return ( k < x.k ) || ( k == x.k && b > x.b ) ;
                }
    } a[ MAXN ] ;
     
    int n , ans[ MAXN ] ;
    int S[ MAXN ] , top = 0 ;
     
    int main(  ) {
                scanf( "%d" , &n ) ;
                for ( int i = 0 ; i ++ < n ; )scanf( "%d%d" , &a[ i ].k , &a[ i ].b ) , a[ i ].t = i ;
                sort( a + 1 , a + n + 1 ) ;
                for ( int i = 0 ; i ++ < n ; ) {
                            if ( top && a[ S[ top ] ].k == a[ i ].k ) continue ;
                            while ( top > 1 ) {
                                         double x = double( a[ i ].b - a[ S[ top ] ].b ) / double( a[ S[ top ] ].k - a[ i ].k ) ;
                                         double y = a[ i ].k * x + a[ i ].b ;
                                         if ( a[ S[ top - 1 ] ].k * x + a[ S[ top - 1 ] ].b >= y ) {
                                                     top -- ;
                                        } else break ;
                            }
                            S[ ++ top ] = i ;
                }
                for ( int i = 0 ; i ++ < top ; ) ans[ i ] = a[ S[ i ] ].t ;
                sort( ans + 1 , ans + top + 1 ) ;
                for ( int i = 0 ; i ++ < top ; )printf( "%d " , ans[ i ] ) ;printf( "\n" ) ;
                return 0 ;
    }
    

    相关文章

      网友评论

        本文标题:BZOJ-1007: [HNOI2008]水平可见直线

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