信息学竞赛题解(IO题解)

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

2018-10-16  本文已影响0人  AmadeusChan

题目: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 ;
}
上一篇下一篇

猜你喜欢

热点阅读