hdu_5762_Teacher Bo(鸽笼原理)
题目链接:hdu_5762_Teacher Bo
题意:
给你n个点,问你能否找到两对点的曼哈顿距离相等
题解:
最开始看到这题,看数据以为要向nlogn的复杂度发展,结果经验误导了自己,我们仔细观察可以发现,题目给的点的坐标范围为0~1e5,说明所有的点对的曼哈顿距离的种数不会超过2*m+1,意思就是n个点的曼哈顿距离的范围为0~200000,所以如果点对的个数大于2*m+1,那么必定会有重复的曼哈顿距离,也就是由两对点的曼哈顿距离相同,所以特判后直接暴力,复杂度不超过10W.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include<cstring> 3 int abs(int a){return a>0?a:-a;} 4 const int N=1E5+7; 5 struct point{int x,y;}; 6 point a[N]; 7 bool vis[N*2]; 8 int main() 9 { 10 int n,t,m; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d%d",&n,&m); 15 long long nn=n; 16 for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y); 17 if(nn*(nn-1)/2>2*m+5){puts("YES");continue;} 18 memset(vis,0,sizeof(vis)); 19 int fg=0; 20 for(int i=1;i<=n;i++) 21 { 22 if(fg)break; 23 for(int j=i+1;j<=n;j++) 24 { 25 int dis=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y); 26 if(vis[dis]){fg=1;break;}else vis[dis]=1; 27 } 28 } 29 if(fg)puts("YES");else puts("NO"); 30 } 31 return 0; 32 }