HDU 5762(暴力)

来源:互联网 发布:淘宝的老板是谁 编辑:程序博客网 时间:2024/05/18 05:59

      • Problem Description
      • Input
      • Output
      • 题目大意
      • 分析
      • 代码

Problem Description

Teacher BoBo is a geography teacher in the school.One day in his class,he marked N 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,A≠CorB≠D) 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.(T≤50)

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

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

Output

T lines, each line is YES or NO.

题目大意

问能否找到两组不同的点对(A,B)、(C,D)(A,B,C,D均为点坐标的编号,A

分析

题中所给各点坐标均为整数,取值范围在[0,M],可以很快想到曼哈顿距离的域为[0,2M]。
根据抽屉原理

如果n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或更多的物体。

即最多暴力枚举2M+1个点对,即可得到判断存在可行点对。

代码

#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<cstdio>using namespace std;const int MAXN = 100000 + 10;const int MOD = 1e9 + 7;int mark[MAXN * 2];int x[MAXN],y[MAXN];int n,m;int getManhattan(int i,int j){    return abs(x[i] - x[j]) + abs(y[i] - y[j]);    }void solve(){    memset(mark,0,sizeof(mark));    for(int i=0;i<n;i++)    {        for(int j=i+1;j<n;j++)        {            int tmp = getManhattan(i,j);            if(mark[tmp])    {printf("YES\n"); return;}            mark[tmp]++;                    }    }    printf("NO\n");}int main(){    int t;    scanf("%d",&t);    while(t-- && scanf("%d %d",&n,&m))    {        for(int i=0;i<n;i++)            scanf("%d %d",&x[i],&y[i]);        solve();    }}
0 0
原创粉丝点击