ABC259D Circumferences
爱的魔力转圈圈……
呃,偏题了。
其实这题还真的和圈圈有关。
题意
有一些圆,问能不能用这些圆从一个点到另一个点。
思路
这是l,这是r,这些圆我不算。这些圆我不算,这该怎么办?构图,构图,构图!好,然后DFS查询。
两个圆相交就在图里面添它们对应的边。
不相交有两种情况:
- $ (x_i - x_j)^2 + (y_i - y_j)^2 < (r_i - r_j)^2 $,即,一个圆在另一个里面。
- $ (x_i - x_j)^2 + (y_i - y_j)^2 > (r_i + r_j)^2 $,即,两个圆隔得太远了,以至于没法产生关系。
(作为高年级的学生你们都知道吧?)
说几个注意点:
- 十年OI一场空,没开LL见祖宗。
- 十年OI一场空,没有平方见祖宗。
- 十年OI一场空,没visit数组见祖宗。
代码
#include <bits/stdc++.h>
using namespace std;
#define sqr(x) ((((x))) * (((x))))
vector<int> gg[200005];
bool vis[200005];
long long x[200005], y[200005], r[200005];
void dfs(int x) {
if (vis[x]) {
return;
}
vis[x] = 1;
for (int node : gg[x]) {
dfs(node);
}
}
int main() {
int n;
scanf("%d", &n);
long long sx, sy, tx, ty;
scanf("%lld %lld %lld %lld", &sx, &sy, &tx, &ty);
int s_circ, t_circ;
for (int i = 0; i < n; i++) {
scanf("%lld %lld %lld", &x[i], &y[i], &r[i]);
if (sqr(sx - x[i]) + sqr(sy - y[i]) == r[i] * r[i]) {
s_circ = i;
}
if (sqr(tx - x[i]) + sqr(ty - y[i]) == r[i] * r[i]) {
t_circ = i;
}
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (sqr(r[i] - r[j]) <= sqr(x[i] - x[j]) + sqr(y[i] - y[j]) && sqr(x[i] - x[j]) + sqr(y[i] - y[j]) <= sqr(r[i] + r[j])) {
gg[i].push_back(j);
gg[j].push_back(i);
}
}
}
dfs(s_circ);
if (vis[t_circ]) {
puts("Yes");
} else {
puts("No");
}
return 0;
}
再见!不求关注,推荐一下也行啊!!!
求各位过路的神犇给蒟蒻推荐一下吧!!!