2016 Multi-University Training Contest 3 1011 Teacher Bo

来源:互联网 发布:linux端口重定向 编辑:程序博客网 时间:2024/06/05 03:52

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5762

题目:

Problem Description
Teacher BoBo is a geography teacher in the school.One day in his class,he markedN 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,ACorBD) 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".
 

Input
First line, an integer T. There are T test cases.(T50)

In each test case,the first line contains two intergers, N, M, means the number of points and the range of the coordinates.(N,M105).

Next N lines, the i-th line shows the coordinate of the i-th point.(Xi,Yi)(0Xi,YiM).
 

Output
T lines, each line is "YES" or "NO".
 

Sample Input
23 101 12 23 34 108 82 33 34 4
 

Sample Output
YESNO

考虑一种暴力,每次枚举两两点对之间的曼哈顿距离,并开一个桶记录每种距离是否出现过,如果某次枚举出现了以前出现的距离就输 YESYESYES ,否则就输 NONONO .

注意到曼哈顿距离只有 O(M)O(M)O(M) 种,根据鸽笼原理,上面的算法在 O(M)O(M)O(M) 步之内一定会停止.所以是可以过得.

一组数据的时间复杂度 O(min{N2,M})O(\min{N^2,M})O(min{N2,M}) .

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define N 210000using namespace std;int x[N],y[N],mp[N],n,m;int main(){    int T;    cin>>T;    while(T--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            scanf("%d%d",&x[i],&y[i]);        int cnt=0,flag=1;        memset(mp,0,sizeof(mp));        for(int i=0;i<n&&flag;i++)            for(int j=0;j<i&&flag;j++)            {                int t=abs(x[i]-x[j])+abs(y[i]-y[j]);                if(mp[t])                {                    flag=0;                    break;                }                else    mp[t]=1;            }        if(flag)    cout<<"NO"<<endl;        else    cout<<"YES"<<endl;    }}

0 0
原创粉丝点击