結果
| 問題 | 
                            No.96 圏外です。
                             | 
                    
| コンテスト | |
| ユーザー | 
                             koyopro
                         | 
                    
| 提出日時 | 2015-10-02 11:49:30 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,075 bytes | 
| コンパイル時間 | 1,549 ms | 
| コンパイル使用メモリ | 168,004 KB | 
| 実行使用メモリ | 130,240 KB | 
| 最終ジャッジ日時 | 2024-07-19 19:04:28 | 
| 合計ジャッジ時間 | 6,516 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 12 WA * 16 | 
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(int i=0; i<(n); i++)
#define AREAS 2222
#define DIFF 1e4
int N;
struct pos {  int x, y, u; pos(int _x, int _y): x(_x), y(_y){}; };
vector<pos> ps;
vector<int> area[AREAS][AREAS];
pos areapos(pos p) {
    return pos(p.x / 10, p.y / 10);
}
int distance2(pos a, pos b) {
    return pow(a.x - b.x, 2) + pow(a.y - b.y, 2);
}
int root(int i) {
    if (ps[i].u == i) return i;
    return ps[i].u = root(ps[i].u);
}
void uni(pos p1, pos p2) {
    ps[root(p1.u)].u = ps[root(p2.u)].u;
}
signed main()
{
    cin >> N;
    int x, y;
    double maxl = (N > 0) ? 2.0 : 1.0;
    REP(i,N) {
        cin>>x>>y;
        pos p = pos(x+DIFF, y+DIFF);
        p.u = i;
        ps.push_back(p);
        int dxy9[] = {0, 1, -1};
        pos ap = areapos(p);
        int found = false;
        REP(i,9) {
            int nx = ap.x + dxy9[i/3];
            int ny = ap.y + dxy9[i%3];
            if (nx<0||2000<=nx||ny<0||2000<=ny) continue;
            for (int pi : area[nx][ny]) {
                pos p1 = ps[pi];
                if (distance2(p, p1) <= 100) {
                    uni(p, p1);
                    found = true;
                    break;
                }
            }
            if (found) break;
        }
        area[ap.x][ap.y].push_back(i);
    }
    vector< vector<int> > unis(N);
    REP(i,N) {
        unis[root(i)].push_back(i);
    }
    REP(i,N) {
        if (unis[i].size() < 2) continue;
        pos p = ps[unis[i][0]];
        int maxj = 0;
        int maxd = 0;
        for (int j : unis[i]) {
            int dist2 = distance2(p, ps[j]);
            if (dist2 > maxd) {
                maxd = dist2;
                maxj = j;
            }
        }
        p = ps[maxj];
        maxj = 0;
        maxd = 0;
        for (int j : unis[i]) {
            int dist2 = distance2(p, ps[j]);
            if (dist2 > maxd) {
                maxd = dist2;
                maxj = j;
            }
        }
        maxl = max(maxl, sqrt(maxd) + 2);
    }
    printf("%.14f\n", maxl);
    return 0;
}
            
            
            
        
            
koyopro