旋轉卡殼 求最遠點對

struct point{
	int x,y;
	point(){}
	point(int xx,int yy){x=xx;y=yy;}
	point operator-(point const &b)const{
		return point(x-b.x,y-b.y);
	}
	int friend operator*(point a,point b){
		return f_abs(a.x*b.y-a.y*b.x);
	}
	int len2(){
		return x*x+y*y;
	}
};
/*==================================================*\
| rotating_calipers 旋轉卡殼 O(N)
| CALL: res = graham(pnt, n); res爲最遠點距離平方;
\*==================================================*/
int rotating_calipers(point pnt[],int n){
    int q=1,ans=0,i;
    for(i=0;i<n;i++){
        while( (pnt[(i+1)%n]-pnt[i])*(pnt[(q+1)%n]-pnt[i])>(pnt[(i+1)%n]-pnt[i])*(pnt[q]-pnt[i]))q=(q+1)%n;
        ans=f_max(ans , f_max((pnt[i]-pnt[q]).len2(),(pnt[(i+1)%n]-pnt[(q+1)%n]).len2()));
    }
    return ans;
}


發佈了71 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章