zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    windows查看和杀死占用端口的进程
    jenkins html报告不显示样式
    解决git一直输入用户名和密码的问题
    git中文乱码问题
    java环境变量配置
    web service
    sql 训练及总结
    js 及jQery
    [TYVJ] P1015 公路乘车
    GIT 基本用法
  • 原文地址:https://www.cnblogs.com/shangyu/p/2872042.html
Copyright © 2011-2022 走看看