转载自:https://blog.csdn.net/Whyckck/article/details/81409742
链接: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
思路:找四个点来判断是否能完全覆盖,对于斜着的情况把所有点转化一下,沿着原点转45°就变成正着的了,这里用到了一个数学知识点,
-
//神兽勿删
-
-
// ━━━━━━神兽出没━━━━━━
-
// ┏┓ ┏┓
-
// ┏┛┻━━┛┻┓
-
// ┃ ┃
-
// ┃ ━ ┃
-
// ┃┳┛┗┳ ┃
-
// ┃ ┃
-
// ┃ ┻ ┃
-
// ┃ ┃
-
// ┗━┓ ┏┛ Code is far away from bug with the animal protecting
-
// ┃ ┃ 神兽保佑,代码无bug
-
// ┃ ┃
-
// ┃ ┗━━━┓
-
// ┃ ┣┓
-
// ┃ ┏┛
-
// ┗┓┓┏━┳┓┏┛
-
// ┃┫┫ ┃┫┫
-
// ┗┻┛ ┗┻┛
-
//
-
// ━━━━━━感觉萌萌哒━━━━━━
-
// ┏┓ ┏┓
-
// ┏┛┻━━┛┻┓
-
// ┃ ┃
-
// ┃ ━ ┃
-
// ┃ > < ┃
-
// ┃ ┃
-
// ┃… ⌒ … ┃
-
// ┃ ┃
-
// ┗━┓ ┏┛
-
// ┃ ┃ Code is far away from bug with the animal protecting
-
// ┃ ┃ 神兽保佑,代码无bug
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┗━━━┓
-
// ┃ ┣┓
-
// ┃ ┏┛
-
// ┗┓┓┏━┳┓┏┛
-
// ┃┫┫ ┃┫┫
-
// ┗┻┛ ┗┻┛
-
#include<bits/stdc++.h>
-
using
namespace
std;
-
#define maxn 2000005
-
typedef
long
long ll;
-
ll T,n;
-
struct Why
-
{
-
ll x,y;
-
}A[maxn];
-
int main()
-
{
-
ios::sync_with_stdio(
false);
-
cin.tie(
0);
cout.tie(
0);
-
cin >> T;
-
while(T–)
-
{
-
cin >> n;
-
ll mx =
-1e18,my =
-1e18,mix =
1e18,miy =
1e18,flag =
0;
-
for(ll i =
1; i <= n; i++)
-
{
-
cin >> A[i].x >> A[i].y;
-
mx = max(A[i].x,mx);
-
my = max(A[i].y,my);
-
mix = min(A[i].x,mix);
-
miy = min(A[i].y,miy);
-
}
-
for(ll i =
1; i <= n; i++)
-
{
-
if(A[i].x == mx && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mx && A[i].y == miy)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == miy)
-
flag =
1;
-
}
-
mx =
-1e18;my =
-1e18;mix =
1e18;miy =
1e18;
-
for(ll i =
1; i <= n; i++)
-
{
-
ll xx = A[i].x,yy = A[i].y;
-
A[i].x = xx - yy;
-
A[i].y = xx + yy;
-
mx = max(A[i].x,mx);
-
my = max(A[i].y,my);
-
mix = min(A[i].x,mix);
-
miy = min(A[i].y,miy);
-
}
-
for(ll i =
1; i <= n; i++)
-
{
-
if(A[i].x == mx && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mx && A[i].y == miy)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == miy)
-
flag =
1;
-
}
-
if(flag ==
1)
-
cout <<
“Yes” <<
endl;
-
else
-
cout <<
“No” <<
endl;
-
}
-
return
0;
-
}
</div>
发现这个思路和清华一位大佬的一样,这里贴出代码。orz
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
struct A
{
long long x,y;
}a[1000005];
long long n,ma_x,ma_y,t,mi_x,mi_y,mi_b1,ma_b1,mi_b2,ma_b2;
int main()
{
cin>>t;
while(t--)
{
int f=0;
ma_x=ma_y=ma_b1=ma_b2=-1000000010;
mi_x=mi_y=mi_b1=mi_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++) {
ma_x=max(ma_x,a[i].x);
mi_x=min(mi_x,a[i].x);
ma_y=max(ma_y,a[i].y);
mi_y=min(mi_y,a[i].y);
mi_b1=min(mi_b1,a[i].x+a[i].y);
ma_b1=max(ma_b1,a[i].x+a[i].y);
mi_b2=min(mi_b2,a[i].x-a[i].y);
ma_b2=max(ma_b2,a[i].x-a[i].y);
}
for(int i=1;i<=n;i++)
{
if(((a[i].x==ma_x||a[i].x==mi_x)&&(a[i].y==ma_y||a[i].y==mi_y))||((a[i].x+a[i].y==ma_b1||a[i].x+a[i].y==mi_b1)&&(a[i].x-a[i].y==ma_b2||a[i].x-a[i].y==mi_b2)))
{
f=1;
break;
}
}
if(f) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
链接: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
思路:找四个点来判断是否能完全覆盖,对于斜着的情况把所有点转化一下,沿着原点转45°就变成正着的了,这里用到了一个数学知识点,
-
//神兽勿删
-
-
// ━━━━━━神兽出没━━━━━━
-
// ┏┓ ┏┓
-
// ┏┛┻━━┛┻┓
-
// ┃ ┃
-
// ┃ ━ ┃
-
// ┃┳┛┗┳ ┃
-
// ┃ ┃
-
// ┃ ┻ ┃
-
// ┃ ┃
-
// ┗━┓ ┏┛ Code is far away from bug with the animal protecting
-
// ┃ ┃ 神兽保佑,代码无bug
-
// ┃ ┃
-
// ┃ ┗━━━┓
-
// ┃ ┣┓
-
// ┃ ┏┛
-
// ┗┓┓┏━┳┓┏┛
-
// ┃┫┫ ┃┫┫
-
// ┗┻┛ ┗┻┛
-
//
-
// ━━━━━━感觉萌萌哒━━━━━━
-
// ┏┓ ┏┓
-
// ┏┛┻━━┛┻┓
-
// ┃ ┃
-
// ┃ ━ ┃
-
// ┃ > < ┃
-
// ┃ ┃
-
// ┃… ⌒ … ┃
-
// ┃ ┃
-
// ┗━┓ ┏┛
-
// ┃ ┃ Code is far away from bug with the animal protecting
-
// ┃ ┃ 神兽保佑,代码无bug
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┃
-
// ┃ ┗━━━┓
-
// ┃ ┣┓
-
// ┃ ┏┛
-
// ┗┓┓┏━┳┓┏┛
-
// ┃┫┫ ┃┫┫
-
// ┗┻┛ ┗┻┛
-
#include<bits/stdc++.h>
-
using
namespace
std;
-
#define maxn 2000005
-
typedef
long
long ll;
-
ll T,n;
-
struct Why
-
{
-
ll x,y;
-
}A[maxn];
-
int main()
-
{
-
ios::sync_with_stdio(
false);
-
cin.tie(
0);
cout.tie(
0);
-
cin >> T;
-
while(T–)
-
{
-
cin >> n;
-
ll mx =
-1e18,my =
-1e18,mix =
1e18,miy =
1e18,flag =
0;
-
for(ll i =
1; i <= n; i++)
-
{
-
cin >> A[i].x >> A[i].y;
-
mx = max(A[i].x,mx);
-
my = max(A[i].y,my);
-
mix = min(A[i].x,mix);
-
miy = min(A[i].y,miy);
-
}
-
for(ll i =
1; i <= n; i++)
-
{
-
if(A[i].x == mx && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mx && A[i].y == miy)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == miy)
-
flag =
1;
-
}
-
mx =
-1e18;my =
-1e18;mix =
1e18;miy =
1e18;
-
for(ll i =
1; i <= n; i++)
-
{
-
ll xx = A[i].x,yy = A[i].y;
-
A[i].x = xx - yy;
-
A[i].y = xx + yy;
-
mx = max(A[i].x,mx);
-
my = max(A[i].y,my);
-
mix = min(A[i].x,mix);
-
miy = min(A[i].y,miy);
-
}
-
for(ll i =
1; i <= n; i++)
-
{
-
if(A[i].x == mx && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mx && A[i].y == miy)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == my)
-
flag =
1;
-
if(A[i].x == mix && A[i].y == miy)
-
flag =
1;
-
}
-
if(flag ==
1)
-
cout <<
“Yes” <<
endl;
-
else
-
cout <<
“No” <<
endl;
-
}
-
return
0;
-
}
</div>
发现这个思路和清华一位大佬的一样,这里贴出代码。orz