凸包+旋转卡壳法

凸包+旋转卡壳法
题目:poj2187
寻找最远点对距离

#include
using namespace std;
int n;
double eps=1e-10;
double add(double a,double b){//考虑精度的求和
    if(abs(a+b) convex_hull(p* ps,int n){//求凸包,传入数组及数量,传出向量
    sort(ps,ps+n,cmp_x);//先由左到右排序,同X则由下到上
    int k=0;//K个点初始化为0
    vector

qs(n*2);//这就是处理后的数组,先开两倍,因为Kl扫两轮可能会 for(int i=0;i1&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--;// qs[k++]=ps[i];//压入去 } for(int i=n-2,t=k;i>=0;i--){//再扫回来得到上半轮廓 while(k>t&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--; qs[k++]=ps[i];//压入去 } //注意最后K++会多了一 qs.resize(k-1); //所以把长度缩一就是最终的长度了 return qs; } double dist(p pp,p qq){ //求距离 return (pp-qq).dot(pp-qq); //其实这里是方和 } void solve(){ cin>>n;//输入N for(int i=0;i>ps[i].x>>ps[i].y; //输入N个点 vector

qs=convex_hull(ps,n);//执行凸包,删去内部点 int n=qs.size(); //得到新的凸包点集的点数 if(n==2){ //只果只有两个点 printf("%.0f\n",dist(qs[0],qs[1])); //输出 return ; } int i=0,j=0; //开始旋转卡壳法 for(int k=0;k

你可能感兴趣的:(ACM笔记-4几何)