题目链接:HDU 5762
题面:
Teacher Bo
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 644 Accepted Submission(s): 353
Problem Description
Teacher BoBo is a geography teacher in the school.One day in his class,he marked
N
points in the map,the
i
-th point is at
(Xi,Yi)
.He wonders,whether there is a tetrad
(A,B,C,D)(A<B,C<D,A≠CorB≠D)
such that the manhattan distance between A and B is equal to the manhattan distance between C and D.
If there exists such tetrad,print "YES",else print "NO".
If there exists such tetrad,print "YES",else print "NO".
Input
First line, an integer
T
. There are
T
test cases.
(T≤50)
In each test case,the first line contains two intergers, N, M, means the number of points and the range of the coordinates. (N,M≤105) .
Next N lines, the i -th line shows the coordinate of the i -th point. (Xi,Yi)(0≤Xi,Yi≤M) .
In each test case,the first line contains two intergers, N, M, means the number of points and the range of the coordinates. (N,M≤105) .
Next N lines, the i -th line shows the coordinate of the i -th point. (Xi,Yi)(0≤Xi,Yi≤M) .
Output
T
lines, each line is "YES" or "NO".
Sample Input
2 3 10 1 1 2 2 3 3 4 10 8 8 2 3 3 3 4 4
Sample Output
YES NO
Source
题意:
问给定的点中,是否存在两对点的曼哈顿距离完全相同,两对点不可以是同一对点。
解题:
其实这题考察的就是暴力,只要抓住差值范围是在0-2*10^5范围内这一点就可以解决。看似n^2遍历,实则最多只会在2*10^5时停下来,用vis数组标记一下即可,如果出现点访问两次即有。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#define LL long long
using namespace std;
bool vis[200005];
int x[100005],y[100005];
int main()
{
int t,n,m,tmp;
bool flag=0;
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
tmp=abs(x[j]-x[i])+abs(y[j]-y[i]);
if(vis[tmp])
{
flag=1;
break;
}
else
vis[tmp]=1;
}
if(flag)break;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}