rt
心态炸了
const ll MAXN=5e4+5;
ll n,ans;
struct point{
ldb X,Y;
};
point p[MAXN];
ldb dis(point p1,point p2){
return (p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y);
}
bool cmp_y(point p1,point p2){
return p1.Y==p2.Y?p1.X<p2.X:p1.Y<p2.Y;
}
bool cmp_angle(point p1,point p2){
ldb k1=(p1.Y-p[1].Y)/(p1.X-p[1].X),k2=(p2.Y-p[1].Y)/(p2.X-p[1].X);
if(k1==k2)return abs(p1.X)<abs(p2.X);
if(k1<0){
if(k2>0)return 0;
else return k1<k2;
}
else{
if(k2<0)return 1;
else return k1<k2;
}
}
ldb cross(point O,point A,point B){
ll x1=A.X-O.X,y1=A.Y-O.Y,x2=B.X-O.X,y2=B.Y-O.Y;
return x1*y2-x2*y1;
}
ldb height(point p1,point p2,point tp){
ldb s=abs(cross(p1,p2,tp))/2.0;
return s/sqrt(dis(p1,p2));
}
point q[MAXN];
ll cnt;
int main(){
n=read();
for(int i=1;i<=n;i++)p[i].X=read(),p[i].Y=read();
if(n==2){
cout<<(ll)dis(p[1],p[2]);
return 0;
}
sort(p+1,p+1+n,cmp_y);
sort(p+2,p+1+n,cmp_angle);
// cout<<endl;
// for(int i=1;i<=n;i++)cout<<p[i].X<<" "<<p[i].Y<<endl;
// cout<<endl;
cnt=2;
q[1]=p[1],q[2]=p[2];
for(int i=3;i<=n;i++){
while(cnt>1&&cross(q[cnt-1],q[cnt],p[i])<=0)cnt--;
q[++cnt]=p[i];
}
if(cnt==2){
// cout<<"qwq"<<endl;
cout<<dis(q[1],q[2]);
return 0;
}
q[++cnt]=q[1];
// cout<<cnt<<endl;
// for(int i=1;i<=n;i++)cout<<q[i].X<<" "<<q[i].Y<<endl;
// cout<<endl;
ll p1=1;
while(p1<=cnt){
ll p2=p1+1,tp=p1+2;
if(p2>cnt)p2-=cnt;
if(tp>cnt)tp-=cnt;
while(height(q[p1],q[p2],q[tp])<=height(q[p1],q[p2],q[tp==cnt?1:tp+1])){
tp++;
if(tp>cnt)tp=1;
}
ans=MAX((ldb)ans,dis(q[p1],q[tp]),dis(q[p2],q[tp]));
p1++;
}
cout<<ans;
return 0;
}