链接: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;
}