一开始只考虑了边和坐标轴平行的矩形。。。先离散,在枚举两点做对角线,用boolean数组判断另外两点。。。
然后猛然想到各种斜矩形。果断重打。。。
还是利用矩形对角线平分的性质,求出每个点对连线的中点,排序,找矩形。
一开始2B地开了实数数组记录中点,然后发现其实除2操作根本毫无意义。。。而且实数的快排判断各种WS。。
改之。。。
然后发现对角线平分的不止有矩形还有平行四边形。。。又开了一个长度数组记录对角线长度。。。
A之。。。
以上就是被这道计几基础题完虐的过程。。。我会说因为数组少开个0还RE了一次么。。。
各种弱啊。。。
AC CODE
program hnoi_2011_day2_rectangle;
var xx,yy:array[1..1500] of int64;
x,y,d:array[1..2250000] of int64;
p1,p2:array[1..2250000] of longint;
n,i,j,tot:longint;
ans,tmp:int64;
//=========================================================================
procedure qsort(l,r:longint);
var tt,k1,k2:int64;
i,j,t2:longint;
begin
k1:=x[(l+r) shr 1]; k2:=y[(l+r) shr 1];
i:=l; j:=r;
repeat
while (x[i]
while (x[j]>k1) or ((x[j]=k1) and (y[j]>k2)) do dec(j);
if i<=j then
begin
tt:=x[i]; x[i]:=x[j]; x[j]:=tt;
tt:=y[i]; y[i]:=y[j]; y[j]:=tt;
tt:=d[i]; d[i]:=d[j]; d[j]:=tt; //记录对角线长度。
t2:=p1[i]; p1[i]:=p1[j]; p1[j]:=t2;
t2:=p2[i]; p2[i]:=p2[j]; p2[j]:=t2;
inc(i); dec(j);
end;
until i>j;
if l
if i
end;
//=========================================================================
begin
assign(input,'1.in'); reset(input);
assign(output,'1.out'); rewrite(output);
readln(n); tot:=0;
for i:=1 to n do readln(xx[i],yy[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
begin inc(tot);
p1[tot]:=i; p2[tot]:=j;
d[tot]:=sqr(xx[i]-xx[j])+sqr(yy[i]-yy[j]);
x[tot]:=xx[i]+xx[j]; //记录中点的时候直接加,不用除、、
y[tot]:=yy[i]+yy[j];
end; qsort(1,tot); ans:=0;
for i:=1 to tot-1 do
begin
for j:=i+1 to tot do
if x[i]=x[j] then
begin
if y[i]<>y[j] then continue;
if d[i]<>d[j] then continue;
tmp:=(xx[p1[i]]-xx[p2[i]])*(yy[p1[j]]-yy[p2[i]])-(xx[p1[j]]-xx[p2[i]])*(yy[p1[i]]-yy[p2[i]]); //叉积还是很好用的、、
if tmp<0 then tmp:=-tmp; tmp:=tmp;
if tmp>ans then ans:=tmp;
end else break;
end; writeln(ans);
end.