poj2002Squares(hash)

http://poj.org/problem?id=2002

刚开始hash的两点 TLE了 又改为一点 已知对角两点 求令两点

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define MOD 977777
 6 int head[1000010],v[1000010],next[1000010],num[1000010][2],t,f[1010][1010];
 7 struct node
 8 {
 9     int x,y;
10 }co[1010];
11 int judge(int s,struct node x)
12 {
13     int i;
14     for(i = head[s] ; i!= -1 ; i = next[i])
15         if(co[v[i]].x==x.x&&co[v[i]].y==x.y)
16         return v[i];
17     return 0;
18 }
19 int DoneSq(struct node a, struct node c)//求令两点 网上搜的公式
20 {
21      struct node b, d;
22      double x,y,mx, my,tx,ty;
23      int s1,s2,i;
24      mx = (a.x+c.x)/2.0, my = (a.y+c.y)/2.0;
25      x = a.x - mx;    y = a.y - my;
26      tx = -y + mx;   ty = x + my;
27      if((tx-(int)tx)!=0||(ty-(int)ty)!=0)
28          return 0;
29      b.x = tx;b.y = ty;
30      x = c.x - mx;    y = c.y - my;
31      tx = - y + mx; ty = x + my;
32      if((tx-(int)tx)!=0||(ty-(int)ty)!=0)
33          return 0;
34      d.x = tx;d.y=ty;
35      s1 = b.x*977+b.y; s1 = s1%MOD;
36      if(s1<0) s1+=MOD;
37      s2 = d.x*977+d.y; s2 = s2%MOD;
38      if(s2<0) s2+=MOD;
39      if(judge(s1,b)&&judge(s2,d))
40      {
41          f[judge(s1,b)][judge(s2,d)] = 1;
42          f[judge(s2,d)][judge(s1,b)] = 1;
43          return 1;
44      }
45      return 0;
46 
47 }
48 void init()
49 {
50     t = 0;
51     memset(head,-1,sizeof(head));
52 }
53 void add(int a,int b)
54 {
55     next[t] = head[a];
56     head[a] = t;
57     v[t] = b;
58     t++;
59 }
60 int main()
61 {
62     int i,j,k,n,g,s,numm;
63     while(cin>>n)
64     {
65         if(n==0)
66         break;
67         init();
68         memset(f,0,sizeof(f));
69         g = 0;numm=0;
70         for(i = 1; i <= n ; i++)
71         {
72             cin>>co[i].x>>co[i].y;
73             s = co[i].x*977+co[i].y;
74             s = s%MOD;
75             if(s<0)
76             s+=MOD;
77             add(s,i);
78         }
79         for(i = 1; i <= n ; i++)
80             for(j = i+1 ; j <= n ; j++)
81             {
82                 if(!f[i][j])
83                 numm+=DoneSq(co[i],co[j]);
84             }
85         cout<<numm<<endl;
86     }
87     return 0;
88 }

 

posted @ 2013-01-22 20:45  _雨  阅读(159)  评论(0编辑  收藏  举报