• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我希望你是我獨家記憶

            一段永遠封存的記憶,隨風而去
            posts - 263, comments - 31, trackbacks - 0, articles - 3
               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

            USACO——511——(凸包)

            Posted on 2008-08-18 01:50 Hero 閱讀(110) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM
            /*
            ID: wangzha4
            LANG: C++
            TASK: fc
            */
            //JUDGE_ID: 65448BI
            /*

               Test 1: TEST OK [0.000 secs, 2992 KB]
               Test 2: TEST OK [0.000 secs, 3124 KB]
               Test 3: TEST OK [0.011 secs, 3124 KB]
               Test 4: TEST OK [0.011 secs, 3120 KB]
               Test 5: TEST OK [0.022 secs, 3124 KB]
               Test 6: TEST OK [0.022 secs, 3120 KB]
               Test 7: TEST OK [0.022 secs, 3124 KB]
               Test 8: TEST OK [0.043 secs, 3120 KB]
            */

            #include 
            <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <ctype.h>
            #include 
            <math.h>
            #include 
            <iostream>
            using namespace std ;
            #define unllong unsigned long long 
            #define unint unsigned int
            #define printline  printf( "\n" ) 
            typedef 
            long long llong ;
            //const double PI = 2.0 * acos( 0.0 ) ;
            #define zero(x) (((x)>0?(x):-(x))<eps)

            const int Base=1000000000;//高精度
            const int Capacity=100;//高精度
            const double eps = 1e-8 ;
            const int INF = 1000000 ;

            const int size = 10010 ;

            struct POINT
            {
                
            double x ;
                
            double y ;
                
            double k ;
            };
            struct POINT point[size] ;

            int stack[size] ; 
            int top = 2 ;

            int inn ;
            double outlen ;

            double fdist( double x1, double y1, double x2, double y2 )
            {
                
            return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ) ;
            }

            void input()
            {
                
            int leftdown = 0 ;
                
            forint i=0; i<inn; i++ ) {
                    scanf( 
            "%lf %lf"&point[i].x, &point[i].y ) ;
                    
            //if( miny>point[i].y || miny==point[i].y&&minx>point[i].x )
                    if( point[leftdown].y>point[i].y||zero(point[leftdown].y-point[i].y)&&point[leftdown].x>point[i].x )
                    leftdown 
            = i ;//找到最左下的點
                }
                
            double temp ;
                temp 
            = point[0].x ; point[0].x = point[leftdown].x ; point[leftdown].x = temp ;
                temp 
            = point[0].y ; point[0].y = point[leftdown].y ; point[leftdown].y = temp ;
                
            forint i=1; i<inn; i++ ) {
                    point[i].k 
            = atan2( point[i].y-point[0].y, point[i].x-point[0].x ) ;
                }
            //以點(minx, miny)計算極角
            }

            double xmult( POINT &p1, POINT &p2, POINT &p0 )
            {
            //計算叉乘--線段旋轉方向和對應的四邊形的面積--返回(p1-p0)*(p2-p0)叉積
             
            //if叉積為正--p0p1在p0p2的順時針方向; if(x==0)共線

                
            return (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y) ;
            }

            int gramcmp1( const void *a, const void *b )
            {
                
            struct POINT *= (struct POINT *)a ;
                
            struct POINT *= (struct POINT *)b ;

                
            if( c->- d->> eps )    return 1 ;
                
            else if( c->- d->< -1*eps ) return -1 ;
                
            else//斜率相等距離遠的點在先
                    return c->- d->> 0 ? 1 : -1 ;
            }

            int gramcmp( const void *a, const void *b )
            {
                
            struct POINT *= (struct POINT *)a ;
                
            struct POINT *= (struct POINT *)b ;

                
            double xmult_val = xmult( *c, *d, point[0] ) ;
                
            if( xmult_val > eps )    return -1 ;
                
            else if( xmult_val < -1*eps ) return 1 ;
                
            else return c->- d->> 0 ? 1 : -1 ;
                //else 
                    
            //return fdist( c->x,c->y,point[0].x,point[0].y )>fdist(d->x,d->y,point[0].x,point[0].y)? -1:1 ;
            }

            void gramham()
            {
            //凸包的點存在于stack[]中
                qsort( point+1, inn-1sizeof(point[1]), gramcmp1 ) ;//極坐標排序--注意只有(n-1)個點

                
            //int stack[size] ; int top = 2 ;
                stack[0= 0 ; stack[1= 1 ; stack[2= 2 ; top  = 2 ;

                
            forint i=3; i<inn; i++ )
                {
                    
            while( top>=1&&xmult( point[i], point[stack[top]], point[stack[top-1]] )>=-1*eps ) 
                        top
            -- ;//順時針方向--刪除棧頂元素
                    stack[++top] = i ;//新元素入棧
                }
                
            /*
                for( int i=0; i<=top; i++ )
                {
                    //printf( "%lf===%lf\n",point[stack[i]].x, point[stack[i]].y ) ;
                    cout << point[stack[i]].x << "====" << point[stack[i]].y << endl ;
                }
                
            */
            }

            void process()
            {
                gramham() ;
            //保存好凸包的點在stack[]中

                outlen 
            = 0.0 ; double x1, x2, y1, y2 ;
                
            forint i=0; i<top; i++ ) {
                    x1 
            = point[stack[i+1]].x ; x2 = point[stack[i]].x ;
                    y1 
            = point[stack[i+1]].y ; y2 = point[stack[i]].y ;
                    outlen 
            += fdist( x1, y1, x2, y2 ) ;
                }
                x1 
            = point[stack[0]].x ; x2 = point[stack[top]].x ;
                y1 
            = point[stack[0]].y ; y2 = point[stack[top]].y ;
                outlen 
            += fdist( x1, y1, x2, y2 ) ;
            }

            void output()
            {
                printf(
            "%0.2lf\n", outlen ) ;
            }

            int main()
            {
                freopen( 
            "fc.in""r", stdin ) ;
                freopen( 
            "fc.out","w",stdout ) ;

                
            //freopen( "in.txt", "r", stdin ) ;

                
            while( scanf( "%d"&inn ) != EOF ) 
                {
                    input() ;

                    process() ;

                    output() ;
                }

                
            return 0 ;
            }
            日日躁夜夜躁狠狠久久AV| 久久久久成人精品无码| 亚洲国产精品成人久久| 久久亚洲AV成人无码电影| 久久99精品久久久久久久久久| 久久99国产精品久久久| 久久免费大片| 亚洲午夜久久久久妓女影院| 中文字幕久久欲求不满| 国产精品久久久香蕉| 国产精品久久久久久吹潮| 欧美粉嫩小泬久久久久久久 | 久久精品国产91久久综合麻豆自制| 亚洲国产成人久久综合一| 无码乱码观看精品久久| 91精品国产高清91久久久久久 | 精品多毛少妇人妻AV免费久久| 国产成人精品久久一区二区三区 | 91视频国产91久久久| 亚洲精品国产自在久久| 国产成人精品久久免费动漫 | 一本久久精品一区二区| 69SEX久久精品国产麻豆| 综合久久一区二区三区 | 欧美成人免费观看久久| 亚洲综合久久综合激情久久| 久久99热这里只有精品国产| 蜜臀久久99精品久久久久久| 国内精品久久久久久久coent| 99久久人妻无码精品系列| 精品人妻伦九区久久AAA片69| 欧美大战日韩91综合一区婷婷久久青草 | 97精品国产91久久久久久| 久久人人爽人人爽人人片AV不| 久久久久18| 久久五月精品中文字幕| 久久97久久97精品免视看 | 77777亚洲午夜久久多喷| 久久久久亚洲av毛片大| 久久精品免费大片国产大片| 国内精品久久久久久中文字幕|