Day2 1522. 無線網絡

Description

有一個由n臺計算機組成的無線網絡。(n <= 1001),正常情況下,每臺計算機都能跟與它距離不超過d的任何計算機通訊(d <= 20000)。地震發生了。所有的計算機都陷入癱瘓。專家們試着一臺一臺地修復計算機,以恢復整個無線網絡。有時在修復的過程中,他們需要測試一下某兩臺計算機能否通訊(如果他們能通過別的正常的計算機進行通訊,也算他們之間可以通訊,即“能否通訊”可以是間接的)。
你的任務,就是模擬修復網絡的過程,並回答“能否通訊”的詢問。

Input

第一行兩個整數,N和d,N表示計算機的數目,d表示兩臺計算機直接可直接通訊的最大距離。接下來的N行,每行兩個整數Xi,Yi,表示每臺計算機的座標。接下來有許多行,每行都是一個操作(或者是修復操作,或者是詢問操作)。
操作的格式如下:
O p (1 <= p <= N) 修復操作,表示修復編號爲p的電腦;
S p q (1 <= p, q <= N) 詢問操作,詢問編號爲p和編號爲q的電腦能否通訊。
如果一臺電腦尚未被修復,則它不能和任何電腦通訊。

Output

對於每個詢問操作:如果能夠通訊,輸出一行SUCCESS;如果無法通訊,輸出一行FAIL

Sample Input

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

Sample Output

FAIL
SUCCESS

Data Constraint

Hint

【限制】
對於50%的數據,N <= 300, 操作次數 <= 10000;
對於100%的數據,N <= 1001, 操作次數 <= 300000。

做法:暴力連邊(距離ok就連),然後做並查集就好了
代碼如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#define rep(i, a, b)    for(int i = a; i <= b; i++)
#define eg(i, x)    for (int i = ls[x]; i; i = e[i].n)
#define N 1007
#define ll long long
using namespace std;
struct arr
{
    int t, n;
}e[N * 1000];

bool b[N];
ll dis, x[N], y[N];
int n, f[N], ls[N * 1000], tot;

ll pf(ll a) { return a * a; }

int find(int x)
{
    if (f[x] == 0) return x;
    f[x] = find(f[x]);
    return f[x];
}

ll read()
{
    ll s = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')    ch = getchar();
    while (ch >= '0' && ch <= '9')  s = s * 10 + ch - '0', ch = getchar();
    return s;
}

bool getdis(int q, int p)
{
    if (pf(x[q] - x[p]) + pf(y[q] - y[p]) <= dis)   return 1;
    return 0;
}

void add(int x, int y)
{
    e[++tot].t = y;
    e[tot].n = ls[x];
    ls[x] = tot;
}

int main()
{
    scanf("%d", &n);
    cin >> dis;
    dis = pf(dis);
    rep(i, 1, n)
        cin >> x[i] >> y[i];
    rep(i, 1, n - 1)
        rep(j, i + 1, n)
            if (getdis(i, j))
            {
                add(i, j);
                add(j, i);
            }
    char ch = getchar();
    int q, p;
    while (~scanf("%c", &ch))
    {
        q = read();
        if (ch == 'S')  
        {
            p = read();
            int q1 = find(p), p1 = find(q);
            if (q1 != p1 || !b[q] || ! b[p])    printf("FAIL\n");
            else printf("SUCCESS\n");
        }
        if (ch == 'O')
        {
            b[q] = 1;
            eg(i, q)
                if (b[e[i].t])
                {
                    int q1 = find(e[i].t), p1 = find(q);
                    if (q1 != p1)   f[p1] = q1;
                }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章