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;
}
旋转卡壳 求最远点对
最新推荐文章于 2019-08-25 21:37:12 发布