平面最远点对裸题。
来填坑了QAQ。
(求完凸包暴力都能过差评)
【代码】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define N 50005
using namespace std;
typedef long long ll;
ll read()
{
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int n,top;
class Node{
public:
double x,y;
Node(){}
Node(double xx,double yy){
x=xx,y=yy;
}
}e[N],q[N];
bool operator <(Node a,Node b){
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
Node operator -(Node a,Node b){
return Node(a.x-b.x,a.y-b.y);
}
double cross(Node a,Node b){
return a.x*b.y-a.y*b.x;
}
void Andrew()
{
sort(e+1,e+1+n);
q[++top]=e[1];
for(int i=2;i<=n;i++)
{
while(top>1&&cross(q[top]-q[top-1],e[i]-q[top-1])<=0) top--;
q[++top]=e[i];
}
int k=top;
for(int i=n-1;i;i--)
{
while(top>k&&cross(q[top]-q[top-1],e[i]-q[top-1])<=0) top--;
q[++top]=e[i];
}
}
double ans;
double Dis(Node a,Node b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void Rc()
{
int s=2;
for(int i=1;i<top;i++)
{
while(cross(q[i+1]-q[i],q[s]-q[i])<cross(q[i+1]-q[i],q[s+1]-q[i+1]))
s=s%(top-1)+1;
ans=max(ans,max(Dis(q[s],q[i]),Dis(q[s+1],q[i+1])));
}
printf("%d\n",(int)ans);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
e[i].x=read(),e[i].y=read();
Andrew();
Rc();
return 0;
}