トレーニング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つの形式のいずれかでの操作が含まれています。
-
「OのP」(1 <= p <= N)、コンピュータpを修復する手段。
-
「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;
}