2016 Multi-University Training Contest 3 1011【鸽巢原理】

题解:
坐标(0,m)的话,闭区间,可能一共有多少曼哈顿距离?
2m
但是给一个n,可能存在n(n+1)/2个曼哈顿距离
所以可以用抽屉原理了
当n比抽屉的数量大,直接输出yes
不用计算
那。。。NO呢
那就暴力
n^2
这个n肯定不会太大

队友code……..

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x3f3f3f
#define pi acos(-1.0)
#define MAX 200010
#define mod 9973
#define ll long long
int n,m;
int dist[MAX];
struct node
{
    int x,y;
}d[MAX];
bool cmp(node a,node b)
{
    if(a.x==b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int main()
{
    int t,i,j,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(dist,0,sizeof(dist));
        for(i=0;i<n;i++)
            scanf("%d%d",&d[i].x,&d[i].y);
        sort(d,d+n,cmp);
        ll sum=2*m;
        if(n>2*m)
        {
            printf("YES\n");
            continue;
        }
        ll cont=0;
        int flag=0;
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                cont++;
                int a=abs(d[i].x-d[j].x)+abs(d[i].y-d[j].y);
                dist[a]++;
                if(dist[a]>1||cont>MAX)
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}
posted @ 2016-07-26 23:08  see_you_later  阅读(156)  评论(0编辑  收藏  举报