没什么神奇的几何题
只要知道 一个矩阵四点共圆 + 两条对角线中点坐标相同 就好了
n2枚举所有可能被构成的对角线
然后从对角线里面挑就好了,但是再n2枚举对角线会爆(别像我一样做题忘记看数据范围)
尝试在同一个圆上来枚举(排序后可以做到),应该。不会炸吧。反正我a掉了(被卡精度了好气哦)
#include <cmath>
#include <cstdio>
#include <algorithm>
#define RG register
#define LL long long
#define N 1510
using namespace std;
int read()
{
int a=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}
return a*f;
}
int n;
LL ans;
struct edge
{
int x,y,len;
int p1,p2;
}a[(N*N)>>1];
int x[N],y[N];
bool cmp(edge a,edge b)
{
if(a.x==b.x)
{
if(a.y==b.y)
{
return a.len<b.len;
}else return a.y<b.y;
}else return a.x<b.x;
}
double calc(int a,int b)
{
return 1.0*sqrt(1ll*((1ll*a*a)+(1ll*b*b)));
}
int cnt;
int main()
{
n=read();
for(RG int i=1;i<=n;i++)
x[i]=read(),y[i]=read();
for(RG int i=1;i<=n;i++)
{
for(RG int j=i+1;j<=n;j++)
{
a[++cnt].len=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
a[cnt].x=x[i]+x[j],a[cnt].y=y[i]+y[j];
a[cnt].p1=i,a[cnt].p2=j;
}
}
sort(a+1,a+cnt+1,cmp);
for(RG int i=1,j;i<=cnt;i=j+1)
{
j=i;
while(a[i].len==a[j+1].len&&a[i].x==a[j+1].x&&a[i].y==a[j+1].y) ++j;
if(i==j) continue;
for(RG int k=i;k<=j;++k)
for(RG int l=k+1;l<=j;++l)
{
double t1=calc(x[a[k].p1]-x[a[l].p1],y[a[k].p1]-y[a[l].p1]);
double t2=calc(x[a[k].p1]-x[a[l].p2],y[a[k].p1]-y[a[l].p2]);
LL S=1ll*(t1*t2+0.5);
ans=max(ans,S);
}
}
printf("%lld\n",ans);
}