結果

問題 No.94 圏外です。(EASY)
ユーザー koyoprokoyopro
提出日時 2015-10-01 17:09:52
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 8 ms / 5,000 ms
コード長 1,315 bytes
コンパイル時間 1,420 ms
コンパイル使用メモリ 149,904 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-08 14:38:20
合計ジャッジ時間 2,500 ms
ジャッジサーバーID
(参考情報)
judge14 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 2 ms
4,376 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 2 ms
4,380 KB
testcase_06 AC 2 ms
4,380 KB
testcase_07 AC 3 ms
4,376 KB
testcase_08 AC 5 ms
4,380 KB
testcase_09 AC 8 ms
4,380 KB
testcase_10 AC 8 ms
4,376 KB
testcase_11 AC 8 ms
4,376 KB
testcase_12 AC 8 ms
4,380 KB
testcase_13 AC 8 ms
4,376 KB
testcase_14 AC 8 ms
4,376 KB
testcase_15 AC 8 ms
4,376 KB
testcase_16 AC 8 ms
4,380 KB
testcase_17 AC 8 ms
4,376 KB
testcase_18 AC 8 ms
4,376 KB
testcase_19 AC 8 ms
4,376 KB
testcase_20 AC 2 ms
4,380 KB
testcase_21 AC 2 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"
using namespace std;

#define REP(i, n) for(int i=0; i<(n); i++)
#define FOR(i, a, b) for(int i=(a);i<(b);i++)

struct obj { int x, y, u; };
int N;
vector<obj> os;
int distance2(int i, int j) {
    return pow(os[i].x - os[j].x, 2) + pow(os[i].y - os[j].y, 2);
}
int root(int i) {
    if (os[i].u == i) return i;
    return os[i].u = root(os[i].u);
}
void join(int i, int j) {
    os[root(i)].u = os[root(j)].u;
}
double maxdis(int u) {
    double maxd = 0;
    vector<int> ui;
    REP(i,N) if (root(i) == u) ui.push_back(i);
    // 面倒なので総当り
    REP(i,ui.size()) {
        FOR(j,i+1,ui.size()) {
            maxd = max(maxd, sqrt(distance2(ui[i],ui[j])));
        }
    }
    return maxd + 2;
}
signed main()
{
    cin >> N;
    os.resize(N);
    REP(i,N) {
        cin >> os[i].x >> os[i].y;
        os[i].u = i;
    }
    // Union-Find木
    REP(i,N) {
        FOR(j,i+1,N) {
            if (root(i) == root(j)) continue;
            if (distance2(i,j) <= 100) {
                join(i,j);
            }
        }
    }
    // それぞれの連結グラフについて最大距離を求める
    double maxd = (N > 0) ? 2.0 : 1.0;
    REP(i,N) {
        if (root(i) != i) continue;
        maxd = max(maxd, maxdis(i));
    }
    printf("%.14f\n", maxd);
    return 0;
}
0