Problem Description
Teacher BoBo is a geography teacher in the school.One day in his class,he markedN
points in the map,the i
-th
point is at (X
i
,Y
i
)
.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≤10
5
)
.
Next N lines, the i
-th
line shows the coordinate of the i
-th
point.(X
i
,Y
i
)(0≤X
i
,Y
i
≤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≤10
Next N lines, the i
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
YESNO
分析:求是否存在四点(a,b,c,d),使得两点(a,b)与另外两点(c,d)间的曼哈顿距离相等
AC代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <string> #include <map> using namespace std; #define mem(a) memset(a, 0, sizeof(a)) const int maxn = 1e5+100; int b[maxn], q[2*maxn+100],a[maxn]; int main() { int t,i,n,m,j,f,res; scanf("%d",&t); while (t --) { mem(q); scanf("%d%d",&n,&m); for (i = 1; i<=n; i++) { scanf("%d%d",&a[i], &b[i]); } if (n>1000) printf("YES\n");//n等于1000时,有1000*999/2种点的组合(距离),如果有相同的距离组合,输出YES,若全部相同, //m最大值为1e5(距离为整数,故最多有2*1e5种距离),1000*999/2>1e5, else //由抽屉原理可知肯定有两个距离相等,故也应输出YES,1000仍可缩小,进一步减少运行时间, //此处节省运行时间,否则后面的代码枚举必定超时 { res = 0; for (i = 1; i<=n; i++) { for (j = i+1; j<=n; j++) { f = abs(a[j]-a[i])+abs(b[j]-b[i]); q[f] ++ ;//保存距离不同的组合 if (q[f] > 1) //大于1,则存在相等距离 { res = 1; goto end;//退出双层循环,至 下面的 end: 位置 } } } end: if (res == 0) printf("NO\n"); else printf("YES\n"); } } return 0; }