为什么按照x轴排序就AC,y轴就WA了呢?
#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int N=5e4+5;
const db esp=1e-9;
int n;
struct zjy
{
ll x,y;
}e[N],Q[N];
ll check(zjy a1,zjy a2,zjy b1,zjy b2)
{
return (a2.x-a1.x)*(b2.y-b1.y)-(a2.y-a1.y)*(b2.x-b1.x);
}
ll dist(zjy a,zjy b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool cmp(zjy p1,zjy p2)
{
ll tmp=check(e[1],p1,e[1],p2);
if(tmp>0)
{
return 1;
}
else if(tmp==0&&dist(e[0],p2)>dist(e[0],p1))
{
return 1;
}
return 0;
}
db cross(zjy a,zjy b,zjy c)
{
return 1.00*abs((db)(a.x*b.y+b.x*c.y+c.x*a.y)-(db)(a.y*b.x+b.y*c.x+c.y*a.x))/2.00;
}
int t=1;
ll maxn=-1e9;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld%lld",&e[i].x,&e[i].y);
if(i!=1&&****(e[1].x>e[i].x||e[i].x==e[1].x&&e[i].y<e[1].y))****
{
swap(e[i],e[1]);
}
}
sort(e+2,e+n+1,cmp);
Q[1]=e[1];
for(int i=2;i<=n;++i)
{
while(t>1&&check(Q[t-1],Q[t],Q[t],e[i])<=0)
{
--t;
}
Q[++t]=e[i];
}
Q[t+1]=e[1];
// cout<<t;
if(t<3)
{
printf("%lld",dist(Q[1],Q[2]));
return 0;
}
int last=3;
for(int i=1;i<=t;++i)
{
while(check(Q[i],Q[i+1],Q[i],Q[last])<check(Q[i],Q[i+1],Q[i],Q[last%t+1]))
{
last=last%t+1;
}
maxn=max(maxn,max(dist(Q[i],Q[last]),dist(Q[i+1],Q[last])));
}
printf("%lld",maxn);
return 0;
}