枚举对角线,两条对角线合法必定中点重合 长度相同
暴力两辆计算竟然没T
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } inline void read(ll &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } struct Point{ ll x,y; Point(ll x=0,ll y=0):x(x),y(y) { } void read(){ ::read(x); ::read(y); } friend bool operator < (const Point &A,const Point &B) { return A.x==B.x?A.y<B.y:A.x<B.x; } friend bool operator == (const Point &A,const Point &B) { return A.x==B.x && A.y==B.y; } friend Point operator + (const Point A,const Point B) { return Point(A.x+B.x,A.y+B.y); } friend Point operator - (const Point A,const Point B) { return Point(A.x-B.x,A.y-B.y); } friend ll operator * (const Point A,const Point B) { return A.x*B.y-B.x*A.y; } friend ll Dist(Point A,Point B){ return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y); } friend ll Cross(Point p1,Point p2,Point p0){ return (p1-p0)*(p2-p0); // return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } }P[1505]; struct Line{ Point M; ll Len; int x,y; Line(){ } Line(int ix,int iy){ x=ix; y=iy; M=P[x]+P[y]; Len=Dist(P[x],P[y]); } bool operator < (const Line &B) const{ return Len==B.Len?M<B.M:Len<B.Len; } }L[2250005]; int n,cnt; ll ans; inline ll Area(int a,int b){ return abs(Cross(P[L[a].x],P[L[b].y],P[L[b].x])); } int main() { freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); for (int i=1;i<=n;i++) P[i].read(); sort(P+1,P+n+1); for (int i=1;i<=n;i++) for (int j=i+1;j<=n;j++) L[++cnt]=Line(i,j); sort(L+1,L+cnt+1); for (int i=1;i<=cnt;i++) for (int j=i+1;j<=cnt && L[i].M==L[j].M && L[i].Len==L[j].Len;j++) ans=max(ans,Area(i,j)); printf("%lld\n",ans); return 0; }