rt,不知道为什么会有小数出来,只有20pts,强转成 long long 又有70pts
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1505;
const long double eps=1e-8;
int n,x[maxn],y[maxn],tot;
struct Edge
{
int sx,sy,ex,ey;
} e[maxn*maxn],a[maxn*maxn],b[maxn*maxn];
int cnt,ind;
int cross(int sx,int sy,int ex,int ey)
{
return sx*ey-sy*ex;
}
bool cmp1(Edge x,Edge y)
{
return cross(x.ex-x.sx,x.ey-x.sy,y.ex-y.sx,y.ey-y.sy)>0;
}
bool cmp2(Edge x,Edge y)
{
if(x.sx!=x.ex)
{
long double k=(x.ey-x.sy)/(double)(x.ex-x.sx);
if(!k)
return x.sx<y.sx;
k=-1.0/k;
long double b1=(long double)(x.sy)-k*x.sx;
long double b2=(long double)(y.sy)-k*y.sx;
return (eps<b2-b1);
}
else
return x.sy<y.sy;
}
int dis(int sx,int sy,int ex,int ey)
{
return (ex-sx)*(ex-sx)+(ey-sy)*(ey-sy);
}
bool cmp3(Edge x,Edge y)
{
return dis(x.sx,x.sy,x.ex,x.ey)<dis(y.sx,y.sy,y.ex,y.ey);
}
double ans;
void work()
{
sort(b+1,b+ind+1,cmp2);
int last=1;
for(int i=1;i<=ind;i++)
{
if(cmp2(b[i],b[i+1])||cmp2(b[i+1],b[i])||i==ind)
{
int len1=dis(b[i].sx,b[i].sy,b[i].ex,b[i].ey);
int len2=dis(b[i].sx,b[i].sy,b[last].sx,b[last].sy);
ans=max(ans,(sqrt(len1)*sqrt(len2)));
last=i+1;
}
}
// cout <<endl;
}
void solve()
{
sort(a+1,a+cnt+1,cmp3);
int last=1;
for(int i=1;i<=cnt;i++)
{
if(dis(a[i].sx,a[i].sy,a[i].ex,a[i].ey)!=dis(a[i+1].sx,a[i+1].sy,a[i+1].ex,a[i+1].ey)||i==cnt)
{
ind=0;
for(int j=last;j<=i;j++)
b[++ind]=a[j];
work();
last=i+1;
}
}
}
signed main()
{
cin >>n;
for(int i=1;i<=n;i++)
cin >>x[i]>>y[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
tot++;
e[tot].sx=x[i],e[tot].sy=y[i],e[tot].ex=x[j],e[tot].ey=y[j];
if(x[i]>x[j])
swap(e[tot].sx,e[tot].ex),swap(e[tot].sy,e[tot].ey);
else if(x[i]==x[j]&&y[i]>y[j])
swap(e[tot].sy,e[tot].ey);
}
sort(e+1,e+tot+1,cmp1);
int last=1;
for(int i=1;i<=tot;i++)
{
if(cross(e[i].ex-e[i].sx,e[i].ey-e[i].sy,e[i+1].ex-e[i+1].sx,e[i+1].ey-e[i+1].sy)!=0||i==tot)
{
cnt=0;
for(int j=last;j<=i;j++)
a[++cnt]=e[j];
solve();
last=i+1;
}
// cout <<i<<" "<<e[i].sx<<" "<<e[i].sy<<" "<<e[i].ex<<" "<<e[i].ey<<endl;
}
cout <<(long long)ans<<endl;
return 0;
}
/*
4
-100000000 -100000000
-100000000 100000000
100000000 -100000000
100000000 100000000
*/