牛客网 Wannafly挑战赛21

Z市是一座港口城市,来来往往的船只依靠灯塔指引方向。
在海平面上,存在n个灯塔。每个灯塔可以照亮以它的中心点为中心的90°范围。特別地, 由于特殊限制,每个灯塔照亮范围的角的两条边必须要么与坐标轴平行要么与坐标轴成45°。 由于经费限制,Z市的灯塔只能被点亮一座。你需要求出在这种情况下,是否存在一座灯塔能够照亮Z市的所有灯塔。

输入描述:

第一行一个整数T,表示数据组数。
对于每组数据,第一行一个整数n,表示灯塔的数量。
接下来n行,每行两个整数xi,yi,表示第i座灯塔的坐标点。

输出描述:

如果存在一座灯塔能够照亮Z市的所有灯塔则输出Yes,否则输出No(区分大小写)。
示例1

输入

复制
2
4
1 1
1 2
2 1
2 2
5
4 7
0 4
7 3
3 0
3 4

输出

复制
Yes
No

备注:

n≤1000000,T≤10,0≤|xi|,|yi|≤109







#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;
#define ll long long 
#define  N 1000009
#define  gep(i,a,b)  for(int i=a;i<=b;i++)
#define  mem(a,b)  memset(a,b,sizeof(a))
int t,n;
struct Node{
    int x,y;
}nod[N],p[4];
bool cmp1(Node a,Node b)
{
    return a.x<b.x;
}
bool cmp2(Node a,Node b){
    return  a.y<b.y;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        gep(i,0,n-1){
            scanf("%d%d",&nod[i].x,&nod[i].y);
        }
        sort(nod,nod+n,cmp1);
        p[0]=nod[0];p[1]=nod[n-1];
        sort(nod,nod+n,cmp2);
        p[2]=nod[0];p[3]=nod[n-1];
        if(p[0].y==p[2].y||p[0].y==p[3].y||p[1].y==p[2].y||p[1].y==p[3].y){
            printf("Yes\n");
            continue;
        }
        bool judge[4]={1,1,1,1};
        gep(i,0,n-1){
            if(abs(nod[i].y-p[0].y)>abs(nod[i].x-p[0].x))
                judge[0]=0;
            if(abs(nod[i].y-p[1].y)>abs(nod[i].x-p[1].x))
                judge[1]=0;
            if(abs(nod[i].y-p[2].y)<abs(nod[i].x-p[2].x))
                judge[2]=0;
            if(abs(nod[i].y-p[3].y)<abs(nod[i].x-p[3].x))
                judge[3]=0;
        }
        if(judge[0]+judge[1]+judge[2]+judge[3])
            printf("Yes\n");
        else
            printf("No\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/tingtin/p/9458868.html