#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define zero(x) (fabs(x)<eps)
#define pi acos(-1.0)
#define f1 first
#define f2 second
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define initial 1,n,1
const int inf=0x3f3f3f3f;
const long long INF=1LL<<50;
using namespace std;
typedef long long LL;
typedef pair <int, int> PII;
template<typename X> inline bool minimize(X&p,X q){if(p<=q)return 0;p=q;return 1;}
template<typename X> inline bool maximize(X&p,X q){if(p>=q)return 0;p=q;return 1;}
#define N 100005
double add(double a,double b)
{
if (abs(a+b)<eps*(abs(a)+abs(b))) return 0;
return a+b;
}
struct P{
double x,y;
P(){}
P(double x,double y):x(x),y(y){}
P operator+(P p){return P(add(x,p.x),add(y,p.y));}
P operator-(P p){return P(add(x,-p.x),add(y,-p.y));}
P operator*(double d){return P(x*d,y*d);}
double dot(P p){return add(x*p.x,y*p.y);}//内积
double det(P p){return add(x*p.y,-y*p.x);}//外积
};
P a[N];
vector<P > qq;
int n;
bool cmp(const P&p ,const P&q)
{
if (p.x!=q.x) return p.x<q.x;
return p.y<q.y;
}
void convex(P* st,int n,vector<P> &ps)
{ ps.resize(n*2);
int k=0;
sort(st,st+n,cmp);
for (int i=0;i<n;i++)
{ while (k>1&&(ps[k-1]-ps[k-2]).det(st[i]-ps[k-1])<=0) k--;
//若想含边上的点,可以将<=改成<
ps[k++]=st[i];
}
for (int i=n-2,t=k;i>=0;i--)
{ while (k>t&&(ps[k-1]-ps[k-2]).det(st[i]-ps[k-1])<=0) k--;
ps[k++]=st[i];
}
ps.resize(max(k-1,1));
}
double dist(P& p,P& q)
{
return (p-q).dot(p-q);
}
void doit()
{ for (int i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
convex(a,n,qq);
int nn=qq.size();
if (nn==1)
{
printf("0\n");return;
}
if (nn==2)
{
printf("%.0lf\n",dist(qq[0],qq[1]));return;
}
int i=0,j=0;
for (int k=0;k<nn;k++)
{
if (!cmp(qq[i],qq[k])) i=k;
if (cmp(qq[j],qq[k])) j=k;
}
double res=0;
int si=i,sj=j;
while (i!=sj||j!=si)
{
res=max(res,dist(qq[i],qq[j]));
if ((qq[(i+1)%nn]-qq[i]).det(qq[(j+1)%nn]-qq[j])<0)//逆顺正好反
i=(i+1)%nn;
else j=(j+1)%nn;
}
printf("%.0lf\n",res);
}
int main()
{ while (scanf("%d",&n)!=EOF) doit();
}
POJ 2187 凸包&旋转卡壳
最新推荐文章于 2018-07-30 14:43:00 发布