凸包及旋转卡壳模板

https://cn.vjudge.net/problem/POJ-2187

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define  ll   long long
using namespace std;
const int Maxx=50010;
struct P
{
    double x,y;
    P() {}
    P(double x,double y) : x(x),y(y) {}
    P operator + (P p)
    {
        return P(x+p.x,y+p.y);
    }
    P operator - (P p)
    {
        return P(x-p.x,y-p.y);
    }
    P operator * (double d)
    {
        return P(x*d,y*d);
    }
    double dot(P p)
    {
        return x*p.x+y*p.y;
    }
    double det(P p) //P ²æ³Ë p
    {
        return x*p.y-y*p.x;
    }
};
P intersection(P p1,P p2,P q1,P q2)
{
    return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}

bool mycmp(const P &p,const P &q)
{
    if(p.x!=q.x) return p.x<q.x;
    return p.y<q.y;
}

vector<P> convex_hull(P* ps,int n)//构造凸包
{
    sort (ps,ps+n,mycmp);
    int k=0;
    vector <P> qs(n*2);
    for(int i=0;i<n;i++)
    {
        while(k>1&&(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];
    }
    qs.resize(k-1);
    return qs;
}
double dist(P p,P q)
{return (p-q).dot(p-q);}
int n;
P ps[Maxx];
void slove()//旋转卡壳
{
    vector<P> qs=convex_hull(ps,n);
    int n=qs.size();
    if(n==2)//凸包退化
    {
        printf("%.0lf\n",dist(qs[0],qs[1]));
        return;
    }
    int i=0,j=0;
    for(int k=0;k<n;k++)
    {
        if(!mycmp(qs[i],qs[k])) i=k;
        if(mycmp(qs[j],qs[k])) j=k;
    }
    double res=0;
    int si=i,sj=j;
    while(i!=sj||j!=si)
    {
        res=max(res,dist(qs[i],qs[j]));
        if((qs[(i+1)%n]-qs[i]).det(qs[(j+1%n)]-qs[j])<0)
            i=(i+1)%n;
        else
            j=(j+1)%n;
    }
    printf("%.0lf\n",res);
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf%lf",&ps[i].x,&ps[i].y);
    //for(int i=0;i<n;i++) cin>>ps[i].x>>ps[i].y;
    slove();
    return 0;
}
发布了38 篇原创文章 · 获赞 12 · 访问量 3939

猜你喜欢

转载自blog.csdn.net/int_lyy/article/details/96834768