hdu_5762_Teacher Bo(鸽笼原理)

题目链接:hdu_5762_Teacher Bo

题意:

给你n个点,问你能否找到两对点的曼哈顿距离相等

题解:

最开始看到这题,看数据以为要向nlogn的复杂度发展,结果经验误导了自己,我们仔细观察可以发现,题目给的点的坐标范围为0~1e5,说明所有的点对的曼哈顿距离的种数不会超过2*m+1,意思就是n个点的曼哈顿距离的范围为0~200000,所以如果点对的个数大于2*m+1,那么必定会有重复的曼哈顿距离,也就是由两对点的曼哈顿距离相同,所以特判后直接暴力,复杂度不超过10W.

 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 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/5708622.html