当前位置: 首页 > 工具软件 > 灯塔 > 使用案例 >

灯塔

贺景胜
2023-12-01

链接:https://www.nowcoder.com/acm/contest/159/A
来源:牛客网
 

灯塔

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

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<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

struct A
{
    long long x,y;
}a[1000005];

long long n,max_x,max_y,t,min_x,min_y,min_b1,max_b1,min_b2,max_b2;

int main()
{
    cin>>t;
    while(t--)
    {
        int flag=0;
        max_x=max_y=max_b1=max_b2=-1000000010;
        min_x=min_y=min_b1=min_b2=1000000010;
        cin>>n;
        for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
        for(int i=1;i<=n;i++) {
             max_x=max(max_x,a[i].x);    //分别求max(x),min(x),max(y),min(y),max(x+y),min(x+y),max(x-y),min(x-y);
             min_x=min(min_x,a[i].x);
             max_y=max(max_y,a[i].y);
             min_y=min(min_y,a[i].y);
             min_b1=min(min_b1,a[i].x+a[i].y);
             max_b1=max(max_b1,a[i].x+a[i].y);
             min_b2=min(min_b2,a[i].x-a[i].y);
             max_b2=max(max_b2,a[i].x-a[i].y);
        }
        for(int i=1;i<=n;i++)
        {
            if(((a[i].x==max_x||a[i].x==min_x)&&(a[i].y==max_y||a[i].y==min_y))||((a[i].x+a[i].y==max_b1||a[i].x+a[i].y==min_b1)&&(a[i].x-a[i].y==max_b2||a[i].x-a[i].y==min_b2)))
            {
                flag=1;
                break;
            }
        }
        if(flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

 类似资料: