链接: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<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int N = 1010;
int t,n;
struct node{
int x,y;
}p[MAXN],a,b,c,d;
bool cmp1(node a,node b){
if(a.x != b.x) return a.x < b.x;
else return a.y < b.y;
}
bool cmp2(node a,node b){
if(a.y == b.y ) return a.x < b.x;
else return a.y < b.y ;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int hmax = -1,lmax = -1;
int hmin = INF ,lmin = INF ;
for(int i=0;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
if(p[i].x > lmax) lmax = p[i].x;
if(p[i].x < lmin) lmin = p[i].x;
if(p[i].y > hmax) hmax = p[i].y;
if(p[i].y < hmin) hmin = p[i].y;
}
int num = 0;
sort(p,p+n,cmp1);
a.x = p[0].x ;a.y = p[0].y;
b.x = p[n-1].x ; b.y = p[n-1].y;
int flag = 1;
if(a.y == hmin||a.y == hmax){
puts("Yes");continue;
}
else{
num = 0;
for(int i=0;i<n;i++){
if(abs(p[i].y-a.y) <= abs(p[i].x-a.x)) num++;
else break;
}
if(num == n){
flag = 1;
puts("Yes");continue;
}
else flag = 0;
}
if(b.y == hmax||b.y == hmin){
puts("Yes");continue;
}
else{
num = 0;
for(int i=0;i<n;i++){
if(abs(p[i].y-b.y) <= abs(p[i].x-b.x)) num++;
else break;
}
if(num == n){
flag = 1;
puts("Yes");continue;
}
else flag = 0;
}
sort(p,p+n,cmp2);
c.x = p[0].x;c.y = p[0].y ;
d.x = p[n-1].x ;d.y = p[n-1].y;
if(c.x == lmin||c.x == lmax){
puts("Yes");continue;
}
else{
num = 0;
for(int i=0;i<n;i++){
if( abs(p[i].y-c.y) >= abs(p[i].x -c.x)) num++;
else break;
}
if(num == n){
flag = 1;
puts("Yes");continue;
}
else flag = 0;
}
if(d.x == lmax||d.x == lmin){
puts("Yes");continue;
}
else{
num = 0;
for(int i=0;i<n;i++){
if( abs(p[i].y-d.y) >= abs(p[i].x -d.x)) num++;
else break;
}
if(num == n){
puts("Yes");continue;
}
else flag = 0;
}
if(!flag){
puts("No");continue;
}
}
return 0;
}