84pts,O(n2) 算法(可过)
求助
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e4+5;
struct node{
int x,y;
inline bool operator <(const node &a) const{
return a.x==x?a.y<y:a.x<x;
}
}p[N];
inline int read(){
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c)) w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
inline void print(int x){
if(x<0) x=-x,putchar('-');
if(x>9) print(x/10);
putchar('0'+x%10);
}
inline node getvec(node a,node b){
return (node){a.x-b.x,a.y-b.y};
}
inline int xmul(node a,node b){
return a.x*b.y-a.y*b.x;
}
inline int dis(node a,node b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int s[N];
int n,cnt,ans;
signed main(){
n=read();
for(register int i=1;i<=n;++i) p[i].x=read(),p[i].y=read();
sort(p+1,p+1+n);
s[++cnt]=1;
for(register int i=2;i<=n;++i){
node a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
while(xmul(a,b)<0 && cnt>1) --cnt,a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
s[++cnt]=i;
}
s[++cnt]=n;
for(register int i=n-1;i;--i){
node a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
while(xmul(a,b)<0 && cnt>1) --cnt,a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
s[++cnt]=i;
}
for(register int i=1;i<cnt;++i)
for(register int j=i+1;j<=cnt;++j)
ans=max(ans,dis(p[s[i]],p[s[j]]));
print(ans);
return 0;
}