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

来源:互联网 发布:农村淘宝代收点 编辑:程序博客网 时间:2024/05/17 07:04

题解:
坐标(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 longint 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;}
0 0