allbarns(哈希)

题目大意:

农民约翰打算建一个新的矩形谷仓。但是,矩形谷仓的 4 个角落不能在落在软土路基上,只能

落在一些固定点上。现在,他已经找到地面上有 N(4 <= N <= 1,000)个点,角落只可以落在这

些点上。他想知道依次每加多一个点,可以建立新谷仓的方法数量,请你帮助他找到答案。 

输入格式: 

第 1行:一个整数,N 

第 2行至N +1行:每行有两个被空格分隔的整数的 x,y,作为一个点的坐标。 

         所有的 x,y都不会超过 16,000。所有点都是不同的。 

输出格式: 

共  N  行:每行表示当前可以建立的新的谷仓的数目。 

 

样例输入(allbarns.in): 

1 2 

1 -2 

2 1 

2 -1 

-1 2 

-1 -2 

-2 1 

-2 -1 

样例输出(allbarns.out): 

样例解释: 

最后的答案是(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表,感觉实现方式不是很难。如何很好地定义一个函数,真的不知道,黑书上说是经验问题。

posted @ 2013-01-24 19:51  改名字干什么  阅读(471)  评论(0编辑  收藏  举报