2020-10-8 组队赛补题 A - Artwork Gym - 102346A(并查集)

Problem A
Artwork
The Mona Dura is one of the most valuable artworks in Nlogonia Museum. The famous painting is
displayed in a rectangular room of M by N meters. The room entrance is in a corner of it, while the
Mona is in the corner diagonally opposite to the entrance.
To prevent theft, the room has motion sensors that are activated every night when the museum
closes. Each sensor has a sensitivity S, such that the sensor triggers an alarm if it detects any movement
at no more than S meters from its location.
Tonight a thief broke into the museum with the purpose to steal the Mona Dura. To achieve his
goal, the thief needs to enter the room and reach the painting without being detected by any of the
motion sensors, that is, he must keep a distance longer to Si meters from the i-th motion sensor all
the time, for all the sensors.
The thief has access to the plants of the museum, therefore, he knows the size of the room, the
coordinates, and the sensitivities of each of the motion sensors. Given this information, your task is
to determine if it is possible for the thief to steal the Mona Dura.
Input
The first line of input contains three integer numbers, M, N, and K, representing the size of the
room, and the number of sensors, respectively. (10 ≤ M, N ≤ 104
, 1 ≤ K ≤ 1000). The entrance to
the room is located at position (0, 0), and the painting at position (M, N).
Each of the next K lines describes one of the K sensors, it contains three integer numbers, X,
Y , and S, where (X, Y ) represents the sensors location and S represents the sensor’s sensitivity.
(0 < X < M, 0 < Y < N, 0 < S ≤ 104
). All dimensions and coordinates in the input are in meters.
It is guaranteed that all sensors have different coordinates.
Output
Your program must output a single line containing the character ‘S’ in case the painting can be
stolen, or the character ‘N’ otherwise.
Input example 1
10 22 2
4 6 5
6 16 5
Output example 1
S
Input example 2
10 10 2
3 7 4
5 4 4
Output example 2
N
Input example 3
100 100 3
40 50 30
5 90 50
90 10 5
Output example 3
S
题意, 给定一个吗mn的矩形区域,区域中有k个圆形区域,问是否能避开圆形区域从(0,0)到达(m,n);
思路:运用并查集,把圆和四个边界看做k+4个点,然后通过判断圆与圆之间,圆与边界之间是否有焦点,是则放入同一个集合之中,最后通过判断边和边之间是否属于同意并查集来判断能否从0,0到m,n;
其中能满足条件的有上边和左边相接(属于同一并查集),上边和下边相接,左边和右边相接,右边和下边相接
AC代码如下:
#include
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
int fa[maxn];
int ex, ey, n;
void init()
{
for(int i = 1; i <= n + 4; i++)fa[i] = i;
}
int findd(int x)
{
return fa[x] == x?x:fa[x] = findd(fa[x]);
}
void unionset(int x, int y)
{
int f1 = findd(x), f2 = findd(y);
if(f1 == f2)
return;
else
fa[f1] = f2;
}
struct point
{
int x, y, r;
} p[maxn];
bool judge(point a, point b)
{
double dis = sqrt((a.x-b.x)
(a.x-b.x)+(a.y-b.y)(a.y-b.y));
return dis<=1.0
a.r + b.r;
}
int main()
{
scanf("%d%d%d",&ex,&ey,&n);
init();
for(int i = 1; i<=n; i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].r);
}
for(int i = 1; i<=n; i++)
{
if(p[i].y + p[i].r >= ey) unionset(i,n+2);//右边界;
if(p[i].y - p[i].r <= 0) unionset(i,n+4);//左边界;
if(p[i].x + p[i].r >= ex) unionset(i,n+3);//下边界;
if(p[i].x - p[i].r <= 0) unionset(i,n+1);//上边界;
for(int j = i+1; j<=n; j++)
{
if(judge(p[i],p[j]))
unionset(i,j);
}
}
if(findd(n+1) == findd(n+3)||findd(n+1) == findd(n+4)||findd(n+2) == findd(n+3)||findd(n+2) == findd(n+4))
printf(“N\n”);
else
printf(“S\n”);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值