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题意:
给出了n个点,之后问有没有两个点直接的曼哈顿距离相等一.总结
这道题的思路并不难,思考不是乱七八糟的瞎想,而是要沿着一条思路深入下去,思路应该是很简单的,肯定要记录计算两两之间的距离,但是关注核心问题是这个距离是否出现过,计算的过程中为了避免重复计算肯定是要记录计算结果的,但是如何计算才能高效的判定这个距离之前是否出现过呢,map或者桶就是个不错的选择。另外这道题中我利用了map来去掉重复的点,这里的点用的是结构体当做key值,但是map是会给这些key值去进排序的,如果是一般的基础数据结构还好说,如果使用结构题的话就用定义"<"// // main.cpp // Teacher Bo // // Created by 张嘉韬 on 16/7/27. // Copyright © 2016年 张嘉韬. All rights reserved. // #include <iostream> #include <map> #include <cstdio> #include <cstring> using namespace std; const int maxn=1000100; bool buc[maxn]; struct point { int x; int y; bool operator <(const point& other) const { if (x< other.x) { return true; } return false; } }; int main(int argc, const char * argv[]) { //freopen("/Users/zhangjiatao/Documents/暑期训练/input.txt","r",stdin); int T; cin>>T; for(int t=1;t<=T;t++) { int n,m,counter=0; //bool buc[maxn]={0}; memset(buc,0,sizeof(buc)); point points[maxn]; map <point,bool> vis; vis.clear(); cin>>n>>m; for(int i=1;i<=n;i++) { point temp; cin>>temp.x>>temp.y; if(vis[temp]==0) { vis[temp]=1; points[++counter]=temp; } } int flag=1; for(int i=1;i<=counter;i++) { if(flag==1) for(int j=i+1;j<=counter;j++) { int temp; temp=abs(points[i].x-points[j].x)+abs(points[i].y-points[j].y); if(buc[temp]==1) {cout<<"YES"<<endl;flag=0;break;} else buc[temp]=1; } else {break;} } if(flag==1) cout<<"NO"<<endl; } return 0; }