• 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
  • 相关阅读:
    多线程
    Java命令行传参
    IO流
    集合
    Java基础语法
    常见的数据结构
    泛型
    java 集合重要概念 (Set 的存储内存解析)
    java 集合重要概念 (== 和 equals 解读)
    java 集合重要概念 (实现一个简单的斗地主)
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5708622.html
Copyright © 2020-2023  润新知