题意:给你n个点,让你找两个数对, A,B 和 C,D ,使得 A 和 B 的曼哈顿距离等于 C 和 D 的曼哈顿距离,问是否存在这样的对, A!=C 且 B!=D .
因为点坐标的范围为
105
,所以说,两个点的曼哈顿距离最多只有
2∗105
,根据鸽巢原理,所以说暴力枚举的复杂度也是
2∗105
,
#include<bits/stdc++.h>
#define LL long long
const int NN=1e6+10;
using namespace std;
//pair<int,i>
struct node{
int x,y;
}p[110000];
map<int,bool>Q;
int main(){
int n,t,m;
scanf("%d",&t);
while(t--){
Q.clear();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
if(n*(n-1)/2>2*m){
puts("YES");
continue;
}
int flag=0;
for(int i=1;i<=n;i++){
if(flag) break;
for(int j=i+1;j<=n;j++){
int f=abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y);
if(Q.count(f)){
puts("YES");
flag=1;
break;
}
else Q[f]=true;
}
}
if(!flag)puts("NO");
}
return 0;
}