結果

問題 No.94 圏外です。(EASY)
ユーザー nanophoto12
提出日時 2014-12-21 22:20:11
言語 C#(csc)
(csc 3.9.0)
結果
AC  
実行時間 55 ms / 5,000 ms
コード長 3,133 bytes
コンパイル時間 1,778 ms
コンパイル使用メモリ 107,904 KB
実行使用メモリ 20,480 KB
最終ジャッジ日時 2024-06-26 07:26:28
合計ジャッジ時間 3,489 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 22
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #
プレゼンテーションモードにする

using System;
using System.Collections.Generic;
using System.Linq;
namespace Yukicoder
{
public class UF
{
private int[] _parent;
private int[] _rank;
public UF(int count)
{
_parent = new int[count];
_rank = new int[count];
for (int i = 0; i < _parent.Length; i++)
{
_parent[i] = i;
}
}
private int Find(int value)
{
var parent = _parent[value];
if (parent == value)
{
return value;
}
_parent[value] = Find(parent);
return _parent[value];
}
public void Combine(int left, int right)
{
var leftParent = Find(left);
var rightParent = Find(right);
if (leftParent == rightParent)
{
return;
}
var leftRank = _rank[leftParent];
var rightRank = _rank[rightParent];
if (leftRank < rightRank)
{
_parent[leftParent] = rightParent;
_rank[rightParent]++;
return;
}
_parent[rightParent] = leftParent;
_rank[leftParent]++;
}
public bool IsSameRoot(int left, int right)
{
return Find(left) == Find(right);
}
}
class Program
{
static double GetDistance(int x1, int y1, int x2, int y2)
{
var dx = x1 - x2;
var dy = y1 - y2;
return Math.Abs(Math.Sqrt(dx*dx + dy*dy));
}
static void Main(string[] args)
{
var n = int.Parse(Console.ReadLine());
int[] xPosition = new int[n];
int[] yPosition = new int[n];
for (int i = 0; i < n; i++)
{
var line = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
xPosition[i] = line[0];
yPosition[i] = line[1];
}
if (n == 0)
{
Console.WriteLine(1);
return;
}
var unionFind = new UF(n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
var distance = GetDistance(xPosition[i], yPosition[i], xPosition[j], yPosition[j]);
if(distance < 10 + 1e-10)
{
unionFind.Combine(i, j);
}
}
}
var maxDistance = 0d;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (unionFind.IsSameRoot(i, j))
{
var distance = GetDistance(xPosition[i], yPosition[i], xPosition[j], yPosition[j]);
maxDistance = Math.Max(maxDistance, distance);
}
}
}
Console.WriteLine(maxDistance + 2);
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0