結果

問題 No.94 圏外です。(EASY)
ユーザー nanophoto12nanophoto12
提出日時 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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 30 ms
19,968 KB
testcase_01 AC 30 ms
19,712 KB
testcase_02 AC 30 ms
19,968 KB
testcase_03 AC 24 ms
18,176 KB
testcase_04 AC 31 ms
19,840 KB
testcase_05 AC 31 ms
19,968 KB
testcase_06 AC 33 ms
19,712 KB
testcase_07 AC 36 ms
20,096 KB
testcase_08 AC 43 ms
19,968 KB
testcase_09 AC 51 ms
20,224 KB
testcase_10 AC 52 ms
20,096 KB
testcase_11 AC 51 ms
20,096 KB
testcase_12 AC 51 ms
20,480 KB
testcase_13 AC 51 ms
20,224 KB
testcase_14 AC 52 ms
20,224 KB
testcase_15 AC 52 ms
20,224 KB
testcase_16 AC 52 ms
20,224 KB
testcase_17 AC 52 ms
20,224 KB
testcase_18 AC 51 ms
19,968 KB
testcase_19 AC 55 ms
20,096 KB
testcase_20 AC 31 ms
19,584 KB
testcase_21 AC 30 ms
19,712 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
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);
        }
    }
}
0