题目大意:
农民约翰打算建一个新的矩形谷仓。但是,矩形谷仓的 4 个角落不能在落在软土路基上,只能
落在一些固定点上。现在,他已经找到地面上有 N(4 <= N <= 1,000)个点,角落只可以落在这
些点上。他想知道依次每加多一个点,可以建立新谷仓的方法数量,请你帮助他找到答案。
输入格式:
第 1行:一个整数,N
第 2行至N +1行:每行有两个被空格分隔的整数的 x,y,作为一个点的坐标。
所有的 x,y都不会超过 16,000。所有点都是不同的。
输出格式:
共 N 行:每行表示当前可以建立的新的谷仓的数目。
样例输入(allbarns.in):
8
1 2
1 -2
2 1
2 -1
-1 2
-1 -2
-2 1
-2 -1
样例输出(allbarns.out):
0
0
0
0
0
1
3
6
样例解释:
最后的答案是(1,2,6,5),(1,3,6,8),(1,4,6,7),(2,3,5,8),(2,4,5,7),(3,4,8,7)
{------------------------------------------------------------------------------------------------------------------------------}
我承认我想了很久,一开始我是没有用hash的算法来想问题的,最后面一测,A了6个点 WA了4个点 两个时间爆了,两个运行错误(数组开小了,开大了空间又会爆)。
时间复杂度三次方的- - 然后就爆了
关键问题是判断,矩形我们可以这样来判断的,如果有两条边他们距离长度相等且他们的中点在同一位置,我们就可以判定这两条边可以生成一个矩形。
然后用哈希表来解决空间复杂度的问题(当然还要挂链)
然后,再一次地用了指针。。。。
代码:
1 program allbarns; 2 const wp=2000007; ww=11; pp=13; qq=17; 3 type 4 point=^rec; 5 rec=record 6 next:point; 7 len:int64; 8 xx,yy,num:int64; 9 end; 10 arr=array[-100..2000700]of point; 11 ar=array[0..1010]of int64; 12 var 13 w,l:int64; 14 i,j:longint; 15 k,m,n,a,b:int64; 16 ux,uy,ans:int64; 17 bool:boolean; 18 p,head,q:point; 19 s:arr; 20 x,y:ar; 21 begin 22 assign(input,'allbarns.in'); 23 assign(output,'allbarns.out'); 24 reset(input); 25 rewrite(output); 26 ans:=0; 27 for i:=1 to wp do 28 begin 29 new(s[i]); 30 s[i]^.xx:=maxlongint; 31 s[i]^.yy:=maxlongint; 32 s[i]^.len:=maxlongint; 33 s[i]^.num:=1; 34 s[i]^.next:=nil; 35 end; 36 readln(n); 37 for i:=1 to n do 38 begin 39 read(x[i],y[i]); 40 for j:=1 to i-1 do 41 begin 42 ux:=(x[i]+x[j]) mod wp; 43 uy:=(y[i]+y[j]) mod wp; 44 l:=((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); 45 w:=(l*ww+l div pp) mod wp; 46 w:=w+abs((ux+uy)div qq+ux*pp+uy); 47 w:=w mod wp; 48 p:=s[w]; 49 bool:=false; 50 while(p^.next<>nil)and(not bool)do 51 begin 52 if (p^.next^.xx=ux)and(p^.next^.yy=uy)and(p^.next^.len=l)then 53 bool:=true 54 else begin 55 p:=p^.next; 56 end; 57 end; 58 if bool then begin ans:=ans+p^.num; inc(p^.num); end 59 else 60 begin 61 new(q); 62 q^.xx:=ux; 63 q^.yy:=uy; 64 q^.len:=l; 65 q^.num:=1; 66 q^.next:=nil; 67 p^.next:=q; 68 end; 69 end; 70 writeln(ans); 71 end; 72 close(input); 73 close(output); 74 end.
用hash表,感觉实现方式不是很难。如何很好地定义一个函数,真的不知道,黑书上说是经验问题。