poj3432---Count Squares

4 篇文章 0 订阅

枚举两点找正方形的另外两点;
1,枚举一条边上的两点找另外两点;
2.枚举对角线上的两点找另外两点;


Count Squares
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 2842 Accepted: 1256

Description

Given a set of points with integer coordinates xi, yi, i = 1...N, your program must find all the squares having each of four vertices in one of these points.

Input

Input file contains integer N followed by N pairs of integers xi yi.

Constraints

-104xi, yi ≤ 104, 1 ≤ N ≤ 2000. All points in the input are different.

Output

Output file must contain a single integer — number of squares found.

Sample Input

Sample input 1
4 0 0 4 3 -3 4 1 7
Sample input 2
9
1 1  1 2  1 3  
2 1  2 2  2 3  
3 1  3 2  3 3

Sample Output

Sample output 1
1
Sample output 2
6

Hint

Bold texts appearing in the sample sections are informative and do not form part of the actual data.


经测试此题用map会TLE,
用flag[][]标记会MLE;
可以采用哈希表存储(x*x+y*y)%MOD;



采用第一种方法(以边上的两点找另外两点);
因为找到的两点的位置不确定,得暴力所有情况然后ans/4;
采用第一种方案
(动态内存版)
340k
250ms;
<pre class="sh_cpp sh_sourceCode" style="font-family:Courier New,Courier,monospace"><span class="sh_preproc">#include</span> <span class="sh_string"><iostream></span>
<span class="sh_preproc">#include</span><span class="sh_string"><cstdio></span>
<span class="sh_preproc">#include</span><span class="sh_string"><cstring></span>
<span class="sh_preproc">#include</span><span class="sh_string"><cmath></span>
<span class="sh_keyword">using</span> <span class="sh_keyword">namespace</span> std<span class="sh_symbol">;</span>
<span class="sh_keyword">struct</span><span class="sh_normal"> </span><span class="sh_classname">points</span>
<span class="sh_cbracket">{</span>
    <span class="sh_type">int</span> x<span class="sh_symbol">,</span>y<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>point<span class="sh_symbol">[</span><span class="sh_number">2010</span><span class="sh_symbol">];</span>
<span class="sh_keyword">const</span> <span class="sh_type">int</span> N <span class="sh_symbol">=</span><span class="sh_number">19997</span><span class="sh_symbol">;</span>
<span class="sh_keyword">struct</span><span class="sh_normal"> </span><span class="sh_classname">node</span>
<span class="sh_cbracket">{</span>
    <span class="sh_type">int</span> x<span class="sh_symbol">,</span>y<span class="sh_symbol">;</span>
    node <span class="sh_symbol">*</span>next<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span><span class="sh_symbol">*</span>head<span class="sh_symbol">[</span>N<span class="sh_number">+10</span><span class="sh_symbol">];</span>
<span class="sh_type">void</span> <span class="sh_function">build</span><span class="sh_symbol">(</span><span class="sh_type">int</span> x<span class="sh_symbol">,</span><span class="sh_type">int</span> y<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
    <span class="sh_type">int</span> ans<span class="sh_symbol">=(</span>x<span class="sh_symbol">*</span>x<span class="sh_symbol">+</span>y<span class="sh_symbol">*</span>y<span class="sh_symbol">)%</span>N<span class="sh_symbol">;</span>
    <span class="sh_keyword">if</span><span class="sh_symbol">(</span>head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]==</span>NULL<span class="sh_symbol">)</span>
    <span class="sh_cbracket">{</span>
        head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]=</span><span class="sh_keyword">new</span> node<span class="sh_symbol">;</span>
        head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]-></span>next<span class="sh_symbol">=</span>NULL<span class="sh_symbol">;</span>
    <span class="sh_cbracket">}</span>
    node <span class="sh_symbol">*</span>q<span class="sh_symbol">=</span><span class="sh_keyword">new</span> node<span class="sh_symbol">;</span>
    q<span class="sh_symbol">-></span>x<span class="sh_symbol">=</span>x<span class="sh_symbol">;</span>
    q<span class="sh_symbol">-></span>y<span class="sh_symbol">=</span>y<span class="sh_symbol">;</span>
    q<span class="sh_symbol">-></span>next<span class="sh_symbol">=</span>head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]-></span>next<span class="sh_symbol">;</span>
    head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]-></span>next<span class="sh_symbol">=</span>q<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
<span class="sh_type">bool</span> <span class="sh_function">Query</span><span class="sh_symbol">(</span>node a<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
    <span class="sh_type">int</span> ans<span class="sh_symbol">=(</span>a<span class="sh_symbol">.</span>x<span class="sh_symbol">*</span>a<span class="sh_symbol">.</span>x<span class="sh_symbol">+</span>a<span class="sh_symbol">.</span>y<span class="sh_symbol">*</span>a<span class="sh_symbol">.</span>y<span class="sh_symbol">)%</span>N<span class="sh_symbol">;</span>
    <span class="sh_keyword">if</span><span class="sh_symbol">(</span>head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]==</span>NULL<span class="sh_symbol">)</span>
        <span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
    node <span class="sh_symbol">*</span>p<span class="sh_symbol">=</span>head<span class="sh_symbol">[</span>ans<span class="sh_symbol">]-></span>next<span class="sh_symbol">;</span>
    <span class="sh_keyword">while</span><span class="sh_symbol">(</span>p<span class="sh_symbol">)</span>
    <span class="sh_cbracket">{</span>
        <span class="sh_keyword">if</span><span class="sh_symbol">(</span>p<span class="sh_symbol">-></span>x<span class="sh_symbol">==</span>a<span class="sh_symbol">.</span>x<span class="sh_symbol">&&</span>p<span class="sh_symbol">-></span>y<span class="sh_symbol">==</span>a<span class="sh_symbol">.</span>y<span class="sh_symbol">)</span>
            <span class="sh_keyword">return</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
        p<span class="sh_symbol">=</span>p<span class="sh_symbol">-></span>next<span class="sh_symbol">;</span>
    <span class="sh_cbracket">}</span>
    <span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
<span class="sh_type">int</span> <span class="sh_function">main</span><span class="sh_symbol">()</span>
<span class="sh_cbracket">{</span>
    <span class="sh_type">int</span> n<span class="sh_symbol">,</span>x<span class="sh_symbol">,</span>y<span class="sh_symbol">;</span>
     <span class="sh_keyword">while</span><span class="sh_symbol">(</span> <span class="sh_symbol">~</span><span class="sh_function">scanf</span><span class="sh_symbol">(</span><span class="sh_string">"%d"</span><span class="sh_symbol">,&</span>n<span class="sh_symbol">))</span>
     <span class="sh_cbracket">{</span>
         <span class="sh_function">memset</span><span class="sh_symbol">(</span>head<span class="sh_symbol">,</span><span class="sh_number">0</span><span class="sh_symbol">,</span><span class="sh_keyword">sizeof</span><span class="sh_symbol">(</span>head<span class="sh_symbol">));</span>
         <span class="sh_keyword">for</span><span class="sh_symbol">(</span><span class="sh_type">int</span> i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>i<span class="sh_symbol"><</span>n<span class="sh_symbol">;</span>i<span class="sh_symbol">++)</span>
         <span class="sh_cbracket">{</span>
             <span class="sh_function">scanf</span><span class="sh_symbol">(</span><span class="sh_string">"%d%d"</span><span class="sh_symbol">,&</span>x<span class="sh_symbol">,&</span>y<span class="sh_symbol">);</span>
             point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>x<span class="sh_symbol">=</span>x<span class="sh_symbol">;</span>
             point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>y<span class="sh_symbol">=</span>y<span class="sh_symbol">;</span>
             <span class="sh_function">build</span><span class="sh_symbol">(</span>x<span class="sh_symbol">,</span>y<span class="sh_symbol">);</span>
         <span class="sh_cbracket">}</span>
         <span class="sh_type">int</span> ans<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>
         node a<span class="sh_symbol">,</span>b<span class="sh_symbol">;</span>
         <span class="sh_keyword">for</span><span class="sh_symbol">(</span><span class="sh_type">int</span> i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>i<span class="sh_symbol"><</span>n<span class="sh_symbol">;</span>i<span class="sh_symbol">++)</span>
         <span class="sh_cbracket">{</span>
             <span class="sh_keyword">for</span><span class="sh_symbol">(</span><span class="sh_type">int</span> j<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>j<span class="sh_symbol"><</span>n<span class="sh_symbol">;</span>j<span class="sh_symbol">++)</span>
             <span class="sh_cbracket">{</span>
                 <span class="sh_keyword">if</span><span class="sh_symbol">(</span>i<span class="sh_symbol">==</span>j<span class="sh_symbol">)</span><span class="sh_keyword">continue</span><span class="sh_symbol">;</span>
                 a<span class="sh_symbol">.</span>x<span class="sh_symbol">=</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>x<span class="sh_symbol">+(</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>y<span class="sh_symbol">-</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>y<span class="sh_symbol">);</span>
                 a<span class="sh_symbol">.</span>y<span class="sh_symbol">=</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>y<span class="sh_symbol">-(</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>x<span class="sh_symbol">-</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>x<span class="sh_symbol">);</span>
                 b<span class="sh_symbol">.</span>x<span class="sh_symbol">=</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>x<span class="sh_symbol">+(</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>y<span class="sh_symbol">-</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>y<span class="sh_symbol">);</span>
                 b<span class="sh_symbol">.</span>y<span class="sh_symbol">=</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>y<span class="sh_symbol">-(</span>point<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>x<span class="sh_symbol">-</span>point<span class="sh_symbol">[</span>j<span class="sh_symbol">].</span>x<span class="sh_symbol">);</span>
                 <span class="sh_keyword">if</span><span class="sh_symbol">(</span><span class="sh_function">Query</span><span class="sh_symbol">(</span>a<span class="sh_symbol">)&&</span><span class="sh_function">Query</span><span class="sh_symbol">(</span>b<span class="sh_symbol">))</span>
                    ans<span class="sh_symbol">++;</span>
             <span class="sh_cbracket">}</span>
         <span class="sh_cbracket">}</span>
         <span class="sh_function">printf</span><span class="sh_symbol">(</span><span class="sh_string">"%d</span><span class="sh_specialchar">\n</span><span class="sh_string">"</span><span class="sh_symbol">,</span>ans<span class="sh_symbol">/</span><span class="sh_number">4</span><span class="sh_symbol">);</span>
     <span class="sh_cbracket">}</span>
    <span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>


采用第二种方案动态内存版;
340k;125ms;
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct points
{
    int x,y;
}point[2010];
const int N =19997;
struct node
{
    int x,y;
    node *next;
}*head[N+10];
void build(int x,int y)
{
    int ans=(x*x+y*y)%N;
    if(head[ans]==NULL)
    {
        head[ans]=new node;
        head[ans]->next=NULL;
    }
    node *q=new node;
    q->x=x;
    q->y=y;
    q->next=head[ans]->next;
    head[ans]->next=q;
}
bool Query(node a)
{
    int ans=(a.x*a.x+a.y*a.y)%N;
    if(head[ans]==NULL)
        return 0;
    node *p=head[ans]->next;
    while(p)
    {
        if(p->x==a.x&&p->y==a.y)
            return 1;
        p=p->next;
    }
    return 0;
}
int main()
{
    int n,x,y;
     while( ~scanf("%d",&n))
     {
         memset(head,0,sizeof(head));
         for(int i=0;i<n;i++)
         {
             scanf("%d%d",&x,&y);
             x<<=1;
             y<<=1;
             point[i].x=x;
             point[i].y=y;
             build(x,y);
         }
         int ans=0;
         node a,b;
         int g,h;
         for(int i=0;i<n;i++)
         {
             for(int j=i+1;j<n;j++)
             {
                 g=point[i].x+point[j].x;
                 h=point[i].y+point[j].y;
                 a.x=(point[j].y-point[i].y+ g)/2;
                 a.y=(point[i].x-point[j].x+h)/2;
                 b.x=(point[i].y-point[j].y+g)/2;
                 b.y=(point[j].x-point[i].x+h)/2;
                 if(Query(a)&&Query(b))
                    ans++;
             }
         }
         printf("%d\n",ans/2);
     }
    return 0;
}




第二种方案静态内存版
380k; 110ms;
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct points
{
    int x,y;
}point[2010];
const int N =19997;
struct node
{
    int x,y;
    node *next;
}head[N+10],T[2010];
int top;
node *creat()
{
    node *p=&T[top++];
    p->next=NULL;
    return p;
}
void build(int x,int y)
{
    int ans=(x*x+y*y)%N;
    node *p=&head[ans];
    if(p==NULL)
    {
        p=creat();
    }
    node *q=creat();
    q->x=x;
    q->y=y;
    q->next=p->next;
    p->next=q;
}
bool Query(node a)
{
    int ans=(a.x*a.x+a.y*a.y)%N;
    node *p=&head[ans];
    if(p==NULL)
        return 0;
    node *q=p->next;
    while(q)
    {
        if(q->x==a.x&&q->y==a.y)
            return 1;
        q=q->next;
    }
    return 0;
}
int main()
{
    int n,x,y;
     while( ~scanf("%d",&n))
     {
         top=0;
         memset(head,0,sizeof(head));
         for(int i=0;i<n;i++)
         {
             scanf("%d%d",&x,&y);
             x<<=1;
             y<<=1;
             point[i].x=x;
             point[i].y=y;
             build(x,y);
         }
         int ans=0;
         node a,b;
         int g,h;
         for(int i=0;i<n;i++)
         {
             for(int j=i+1;j<n;j++)
             {
                 g=point[i].x+point[j].x;
                 h=point[i].y+point[j].y;
                 a.x=(point[j].y-point[i].y+ g)/2;
                 a.y=(point[i].x-point[j].x+h)/2;
                 b.x=(point[i].y-point[j].y+g)/2;
                 b.y=(point[j].x-point[i].x+h)/2;
                 if(Query(a)&&Query(b))
                    ans++;
             }
         }
         printf("%d\n",ans/2);
     }
    return 0;
}





 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值