用向量的外积来代替斜率.可以有效减小误差.
/* I will wait for you */
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<string>
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int maxn=500010;
const int maxm=1010;
const int maxs=26;
const int INF=1<<29;
const int P=1000000007;
struct Point
{
int x,y;
int operator * (const Point a)
{ return x*a.y-a.x*y; }
Point operator - (const Point a)
{ return (Point){x-a.x,y-a.y}; }
bool operator == (const Point a)
{ return a.x==x&&a.y==y; }
}a[maxn],up[maxn],down[maxn];
int dis(Point a,Point b)
{
Point c=a-b;return c.x*c.x+c.y*c.y;
}
bool cmpa(const Point a,const Point b)
{
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
bool cmpb(const Point a,const Point b)
{
return a.x>b.x||(a.x==b.x&&a.y>b.y);
}
int main()
{
int n,headup,headdo;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmpa);up[headup=0]=a[0];
for(int i=1;i<n;i++)
{
if(a[i]==a[i-1]) continue;
while(headup&&(up[headup]-up[headup-1])*(a[i]-up[headup])>0) headup--;
up[++headup]=a[i];
}
sort(a,a+n,cmpb);down[headdo=0]=a[0];
for(int i=1;i<n;i++)
{
if(a[i]==a[i-1]) continue;
while(headdo&&(down[headdo]-down[headdo-1])*(a[i]-down[headdo])>0) headdo--;
down[++headdo]=a[i];
}
int ans=0,t;
while(headup||headdo)
{
if(ans<(t=dis(up[headup],down[headdo]))) ans=t;
if(!headup||!headdo) headup?headup--:headdo--;
else (up[headup]-up[headup-1])*(down[headdo]-down[headdo-1])<=0?headup--:headdo--;
}
printf("%d\n",ans);
return 0;
}