[入门组模拟赛[难]]灯塔

题目描述

输入

输出

样例输入

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 <= x,y <= 10^9

思路:能否找到一个点在边与坐标轴平行的正方形角上或边与坐标轴倾斜四十五度的正方形角上,在输入的时候记录x,y,x+y,x-y的最大值,最小值,然后遍历所有点判断是否在正方形的角上,是的话就令flag=1,退出循环.

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
int T,n,x[N],y[N],xmax,xmin,ymax,ymin;
bool flag;
void get()
{
    for(int i=1;i<=n;i++)
        if(i==1) xmax=xmin=x[i],ymax=ymin=y[i];
        else xmin=min(x[i],xmin),ymin=min(y[i],ymin),xmax=max(x[i],xmax),ymax=max(y[i],ymax);
    for(int i=1;i<=n;i++)
        if((x[i]==xmin||x[i]==xmax)&&(y[i]==ymin||y[i]==ymax))
            flag=1;
    return ;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        flag=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&x[i],&y[i]);
        get();
        for(int i=1;i<=n;i++)
        {
            int tmp=x[i]-y[i];
            y[i]=x[i]+y[i];
            x[i]=tmp;
        }
        get();
        if(flag==1) printf("Yes
");
        else printf("No
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/LJA001162/p/13335713.html