CSES 2195 - Convex Hull 解題心得( 題目 )

解題概念:幾何

解題方法:這題是凸包的模板題,這裡使用Andrew's algorithm分成上凸包跟下凸包處理,下方程式使用單調對列和外積判斷找到凸包,不過這裡注意因為題目給的限制,下方程式碼座標並沒有照順序排序,並且對於面積為0的凸包也沒有特判。

Java參考程式碼(有更好意見可留言於下方,謝謝!)

import java.io.*;

import java.util.*;

public class cses2195 {

    public static int n,u_id=1,d_id=1,x1,x2,y1,y2;

    public static int ret,r;

    public static boolean neg;

    public static P[] pt,up,dn;

    public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));    

    public static void main(String[] args) throws Exception{

        n=readint();

        init();

        for(int i=0;i<n;i++) {

            pt[i]=new P(readint(),readint());

        }

        Sort();

        up[0]=up[1]=pt[0];

        dn[0]=dn[1]=pt[0];

        Up_ConvexHull();

        Down_ConvexHull();

        bw.write((u_id+d_id-2)+"\n");//print ans

        for(int i=u_id;i>0;i--) {

            bw.write(up[i].x+" "+up[i].y+"\n");//print dots

        }

        for(int i=d_id-1;i>1;i--) {

            bw.write(dn[i].x+" "+dn[i].y+"\n");

        }

        bw.flush();

    }

    

    public static void init() {

        pt=new P[n];

        up=new P[n+5];

        dn=new P[n+5];

    }

    

    public static void Sort() {

        Arrays.sort(pt,new Comparator<P>() {

            public int compare(P f,P s) {

                if(f.x==s.x) return f.y-s.y;

                return f.x-s.x;

            }

        });

    }

    

    public static void Up_ConvexHull() throws Exception{

        for(int i=1;i<n;i++) {

            while(cross(up[u_id-1],up[u_id],pt[i])>0) {

                u_id--;

            }

            up[++u_id]=pt[i];

        }

    }

    

    public static void Down_ConvexHull() throws Exception{

        for(int i=1;i<n;i++) {

            while(cross(dn[d_id-1],dn[d_id],pt[i])<0) {

                d_id--;

            }

            dn[++d_id]=pt[i];

        }

    }

    

    public static long cross(P a,P b,P c) {

        x1=b.x-a.x;

        x2=c.x-b.x;

        y1=b.y-a.y;

        y2=c.y-b.y;

        return (long)x1*y2-(long)x2*y1;

    }

    

    public static int readint() throws Exception {

        neg=false;

        ret=0;

        r=br.read();

        if(r=='-') {

            neg=true;

            r=br.read();

        }

        while(r>47&&r<58) {

            ret*=10;

            ret+=(r&15);

            r=br.read();

        }

        if(neg)ret*=-1;

        return ret;

    }

}



class P{

    int x,y;

    P(int a,int b){

        x=a;

        y=b;

    }

}
文章標籤
全站熱搜
創作者介紹
創作者 En Chi Tsung 的頭像
En Chi Tsung

阿祁的部落格

En Chi Tsung 發表在 痞客邦 留言(0) 人氣(13)