2016 Multi-University Training Contest 3 1011 Teacher Bo(模拟)

来源:互联网 发布:广发百发大数据精选 编辑:程序博客网 时间:2024/05/17 06:06

题目链接:hdu5762

简单题意

给一堆平面上的点,让你判断,是否有四元组(a,b,c,d)存在,使ac和bd的曼哈顿距离相等。

附:曼哈顿距离

思路

因为坐标范围是[0,M]M<1e5,所以曼哈顿距离的值的取值范围是12M,所以二重循环遍历边的曼哈顿距离,开个Map保存一下出现过的距离,如果之后再次出现了就直接break,输出yes,否则输出no,很显然,如果出现了2*M+1条边,则必有 一条边重复,所以复杂度上限是Omin(n2,m),不会超过1e5,可以接受。

代码

#include <bits/stdc++.h>using namespace std;map<long long, bool> M;const int maxn = 1e5+10;typedef long long ll;ll x[maxn];ll y[maxn];int main(){    int T;    cin >>T;    while(T --){        int n,m;        scanf("%d %d",&n,&m);        for(int i = 0 ; i < n ;i ++){            scanf("%I64d %I64d",x+i,y+i);        }        bool flag = 0;        for(int i = 0 ; i < n ; i ++){            for(int j = i+1 ; j < n ; j ++){                ll d = abs(x[i]-x[j]) + abs(y[i]-y[j]);                if(d && M[d] == true){                    flag = true;                    M[d] = true;                    break;                }                M[d] = true;            }            if(flag) break;        }        if(flag) puts("YES");        else puts("NO");        M.clear();    }}
0 0
原创粉丝点击