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
直接暴力
注意到曼哈顿距离只有 O(M) 种,根据鸽笼原理,上面的算法在 O(M) 步之内一定会停止.所以是可以过得.
一组数据的时间复杂度 O(min{N2,M}) .
数组要开大!!!!。。错哭了。
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<cstring> #include<queue> #define INF 99999999; using namespace std; int ABS(int x){ if(x<0)return -x; return x; } struct node{ int x,y; }a[200005]; int main(){ int t,n,s; int v[200005]; scanf("%d",&t); while(t--){ int flag=0; memset(v,0,sizeof(v)); scanf("%d%d",&n,&s); for(int i=0;i<n;i++){ scanf("%d%d",&a[i].x,&a[i].y); } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ int m=ABS(a[j].y-a[i].y)+ABS(a[j].x-a[i].x); v[m]++; if(v[m]>=2) { printf("YES\n");//printf("%d~\n",m); flag=1;break; } } if(flag) break; } if(!flag) printf("NO\n"); } return 0; }