Teacher Bo
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1532 Accepted Submission(s): 593
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
哦豁,暴力,另外哈希一下曼哈顿距离,看一看是不是出现过了,如果出现过了就直接输出YES.
因为坐标范围是M所以最多就是2m种,复杂度O(min{N2,M}) 所以可以过
#include <stdio.h>
#include <string.h>
bool book[1111111];
int x[1111111], y[1111111];
int abs(int x)
{
return x > 0 ? x : -x;
}
int main()
{
int t, n, i, j, m;
scanf("%d", &t);
while (t--)
{
memset(book, 0, sizeof book);
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
int f = 1;
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
int l = abs(x[i]-x[j])+abs(y[i]-y[j]);
if (book[l])
{
f = 0;
printf("YES\n");
break;
}
book[l] = 1;
}
if (!f)
break;
}
if (f)
printf("NO\n");
}
return 0;
}
/*
** WWH
** CYH
** HZH
*/