結果
問題 | No.94 圏外です。(EASY) |
ユーザー |
|
提出日時 | 2014-12-08 03:47:17 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 270 ms / 5,000 ms |
コード長 | 1,981 bytes |
コンパイル時間 | 3,599 ms |
コンパイル使用メモリ | 77,924 KB |
実行使用メモリ | 57,076 KB |
最終ジャッジ日時 | 2024-06-26 07:25:50 |
合計ジャッジ時間 | 9,181 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
import java.util.ArrayList;import java.util.Scanner;public class Main94 {public static void main(String[] args) {Main94 p = new Main94();}public Main94() {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] x = new int[n];int[] y = new int[n];for (int i = 0; i < x.length; i++) {x[i] = sc.nextInt();y[i] = sc.nextInt();}solve(x, y);}public void solve(int[] x, int[] y) {if(x.length==0){System.out.println(1);return;}uf(x.length);for(int i=0;i<x.length;i++){for(int j=i+1;j<x.length;j++){boolean isCross = isCrossCircle(x[i], y[i], 5, x[j], y[j], 5);if(isCross)unite(i, j);}}long dist = 0;for(int i=0;i<x.length;i++){for(int j=i+1;j<x.length;j++){if(same(i,j))dist =Math.max(dist, (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));}}if(dist == 0)System.out.println(2);elseSystem.out.println(Math.sqrt(dist)+2);}int[] par;int[] rank;private void uf(int n){par = new int[n];rank = new int[n];for(int i=0;i<n;i++){par[i] = i;rank[i] = 0;}}// 木の根を返すprivate int find(int x){if(par[x] == x)return x;elsereturn par[x] =find(par[x]);}// 併合private void unite(int x, int y){x = find(x);y = find(y);// すでに同じグループif(x==y)return;if(rank[x]<rank[y]){par[x] = y;}else{par[y] = x;if(rank[x]==rank[y])rank[x]++;}}// 同じグループなら真private boolean same(int x, int y){return find(x) == find(y);}// 円が交差しているなら真private boolean isCrossCircle(long x1, long y1, long r1, long x2, long y2, long r2){// 三平方の定理から求めるlong a = (x1-x2)*(x1-x2);long b = (y1-y2)*(y1-y2);long c = (r1+r2)*(r1+r2);return a+b <= c;}}