Description
Solution
把矩形的上下左右四个边界当作4个元素,维护n + 4 个元素的并查集
最后根据四个边界的连通情况判断答案
Code
const int maxn = 2e5 + 7;
int ex,ey,n;
int fa[maxn];
void init() {
for(int i = 1;i <= n + 4;++i) fa[i] = i;
}
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void unionset(int x,int y) {
int f1 = find(x), f2 = find(y);
if(f1 == f2) return ;
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 <= 0) unionset(i,n+1);
if(p[i].x + p[i].r >= ex) unionset(i,n+3);
for(int j = i + 1;j <= n;++j) if(judge(p[i],p[j])) unionset(i,j);
}
if(find(n+1) == find(n+3) || find(n+1) == find(n+4) || find(n+2) == find(n+3) || find(n+2) == find(n+4)) printf("N\n");
else printf("S\n");
return 0;
}