枚举两点找正方形的另外两点;
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
-104 ≤ xi, 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;125ms;
第二种方案静态内存版
380k; 110ms;
经测试此题用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;
}