classSolution{public:doubleminAreaFreeRect(vector<vector<int>>&points){longlongans=LLONG_MAX;// For each A, B pair points, {hash(A, B): (ax, ay, bx, by)}unordered_map<int,vector<tuple<int,int,int,int>>>centerToPoints;for(constvector<int>&A:points)for(constvector<int>&B:points){constintcenter=hash(A,B);centerToPoints[center].emplace_back(A[0],A[1],B[0],B[1]);}// For all pair points "that share the same center"for(constauto&[_,points]:centerToPoints)for(constauto&[ax,ay,bx,by]:points)for(constauto&[cx,cy,dx,dy]:points)// AC is perpendicular to AD// AC dot AD = (cx - ax, cy - ay) dot (dx - ax, dy - ay) == 0if((cx-ax)*(dx-ax)+(cy-ay)*(dy-ay)==0){constlonglongsquaredArea=dist(ax,ay,cx,cy)*dist(ax,ay,dx,dy);if(squaredArea>0)ans=min(ans,squaredArea);}returnans==LLONG_MAX?0:sqrt(ans);}private:inthash(constvector<int>&p,constvector<int>&q){return((longlong)(p[0]+q[0])<<16)+(p[1]+q[1]);}longlongdist(intpx,intpy,intqx,intqy){return(px-qx)*(px-qx)+(py-qy)*(py-qy);}};
classSolution{publicdoubleminAreaFreeRect(int[][]points){Longans=Long.MAX_VALUE;// For each A, B pair points, {hash(A, B): (ax, ay, bx, by)}Map<Integer,List<int[]>>centerToPoints=newHashMap<>();for(int[]A:points)for(int[]B:points){intcenter=hash(A,B);if(centerToPoints.get(center)==null)centerToPoints.put(center,newArrayList<>());centerToPoints.get(center).add(newint[]{A[0],A[1],B[0],B[1]});}// For all pair points "that share the same center"for(List<int[]>pointPairs:centerToPoints.values())for(int[]ab:pointPairs)for(int[]cd:pointPairs){finalintax=ab[0],ay=ab[1];finalintcx=cd[0],cy=cd[1];finalintdx=cd[2],dy=cd[3];// AC is perpendicular to AD// AC dot AD = (cx - ax, cy - ay) dot (dx - ax, dy - ay) == 0if((cx-ax)*(dx-ax)+(cy-ay)*(dy-ay)==0){LongsquaredArea=dist(ax,ay,cx,cy)*dist(ax,ay,dx,dy);if(squaredArea>0)ans=Math.min(ans,squaredArea);}}returnans==Long.MAX_VALUE?0:Math.sqrt(ans);}privateinthash(int[]p,int[]q){return((p[0]+q[0])<<16)+(p[1]+q[1]);}privateLongdist(longpx,longpy,longqx,longqy){return(px-qx)*(px-qx)+(py-qy)*(py-qy);}}
classSolution:defminAreaFreeRect(self,points:List[List[int]])->float:ans=math.inf# For each A, B pair points, {hash(A, B): (ax, ay, bx, by)}centerToPoints=defaultdict(list)forax,ayinpoints:forbx,byinpoints:center=((ax+bx)/2,(ay+by)/2)centerToPoints[center].append((ax,ay,bx,by))defdist(px:int,py:int,qx:int,qy:int)->float:return(px-qx)**2+(py-qy)**2# For all pair points "that share the same center"forpointsincenterToPoints.values():forax,ay,_,_inpoints:forcx,cy,dx,dyinpoints:# AC is perpendicular to AD# AC dot AD = (cx - ax, cy - ay) dot (dx - ax, dy - ay) == 0if(cx-ax)*(dx-ax)+(cy-ay)*(dy-ay)==0:squaredArea=dist(ax,ay,cx,cy)*dist(ax,ay,dx,dy)ifsquaredArea>0:ans=min(ans,squaredArea)return0ifans==math.infelsesqrt(ans)