bzoj 2338 [HNOI2011]数矩形

来源:互联网 发布:移动进销存软件 编辑:程序博客网 时间:2024/06/01 07:25
bzoj <wbr>2338 <wbr>[HNOI2011]数矩形


一开始只考虑了边和坐标轴平行的矩形。。。先离散,在枚举两点做对角线,用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<=jthen
    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+1to n do
    begininc(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+1to 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.

0 0