図互いに素セット

トレーニング4 - Hのタイトル

地震が東南アジアで行われます。ACM(アジア間連携医療チーム)がラップコンピュータとワイヤレスネットワークを設定しましたが、予想外の余震は攻撃、ネットワーク内のすべてのコンピュータがすべて壊れていました。コンピュータは、一つ一つを修復され、そしてネットワークが徐々に再び仕事を始めました。なぜならハードウェア制限しにより、各コンピュータは、直接遠いそれからDメートル以下であるコンピュータと通信することができます。しかし、すべてのコンピュータは、コンピュータAとコンピュータBが直接通信できる場合、コンピュータAとコンピュータBが通信することができると言うことであるか、またはその両方Aと通信することができるコンピュータ・Cが2台の他のコンピュータとの間の通信の仲介、とみなすことができるとB.

2台のコンピュータが通信できる場合は、ネットワークを修復する過程では、労働者は、すべての瞬間において業務の2種類を取り、コンピュータを修理、またはテストすることができます。あなたの仕事は、すべてのテスト作業に答えることです。

入力

最初の行は二つの整数NおよびD(1 <= N <= 1001 0 <= D <= 20000)を含有します。ここでNは、1からNまで番号付けされているコンピュータの数であり、Dは、2台のコンピュータが直接通信可能な最大距離です。次のNラインにおいて、それぞれがN個のコンピュータの座標を2つの整数のXI、YI(0 <= XI、YI <= 10000)を含みます。(N + 1)番目の行からの入力の終わりに、一枚ずつ行われる動作があります。各行は、次の2つの形式のいずれかでの操作が含まれています。

  1. 「OのP」(1 <= p <= N)、コンピュータpを修復する手段。

  2. 「SのPQ」(1 <= P、Q <= N)、コンピュータpおよびqが通信できるかどうかをテストする手段。

入力は300000行を超えることはありません。

出力

各テストの操作については、「SUCCESS」2台のコンピュータが通信できる場合、または「FAIL」でない場合を印刷します。

サンプル入力

4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4

サンプル出力

FAIL
SUCCESS

#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e4 + 5;

int fa[maxn];
bool v[maxn];
pair<int, int> node[maxn];
int n, d;

void initial(int n)
{
	for (int i = 1; i <= n; i++)
	{
		fa[i] = i;
	}
}

int get(int x)
{
	if (x == fa[x])
		return x;
	return fa[x] = get(fa[x]);
}

void merge(int x, int y)
{
	fa[get(x)] = get(y);
}

bool cal(pair<int, int> a, pair<int, int> b)
{
	int x = (a.first - b.first) * (a.first - b.first);
	int y = (a.second - b.second) * (a.second - b.second);

	if ((double)d - sqrt(x + y) >= 0)
		return true;
	else
		return false;
}

int main()
{
	scanf("%d%d", &n, &d);
	initial(n);
	for (int k = 1; k <= n; k++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		node[k] = make_pair(x, y);
	}
	char oper;
	while ((scanf("%c", &oper)) != EOF)
	{
		if (oper == 'O')
		{
			int t;
			scanf("%d", &t);
			v[t] = 1;
			for (int i = 1; i <= n; i++)
				if (v[i] == 1 && cal(node[i], node[t]))
					merge(i, t);
		}
		if (oper == 'S')
		{
			int u, v;
			scanf("%d%d", &u, &v);
			if (get(u) == get(v))
				printf("SUCCESS\n");
			else
				printf("FAIL\n");
		}
	}
	return 0;
}
公開された28元の記事 ウォンの賞賛0 ビュー324

おすすめ

転載: blog.csdn.net/xukeke12138/article/details/104738998
おすすめ