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