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;
}

再见!不求关注,推荐一下也行啊!!!
求各位过路的神犇给蒟蒻推荐一下吧!!!

posted @ 2022-07-10 21:58  A-Problem-Solver  阅读(65)  评论(0编辑  收藏  举报