旋转卡壳 求最远点对

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值