Problem:
A : Soccer / サッカー

問題文

A国とB国の間でAIサッカーの試合をした。あなたの手元には、ある時刻にボールを持っていた選手とその位置を記録した表がある。表は N 行からなり、上から i 番目の行は次に示す要素からなる。

フレーム数 f_i

ボールを持っている選手の背番号 a_i

その選手が属するチーム t_i

その選手の位置を表す座標 x_i , y_i

フレーム数とは、ゲームの開始時刻に 0 に設定され、 1/60 秒ごとに 1 加算される整数のことである。例えば、ゲーム開始からちょうど 1.5 秒後のフレーム数は 90 である。 背番号は各チーム内の 11 人の選手に一意にふられる整数である。さらに、表中の連続する 2 つの記録において、同じチームの異なる背番号の選手がボールを持っているとき、その間に「パス」が行われたとする。記録に存在しないフレームは考慮しなくてよい。

さて、エンジニアであるあなたの仕事は、各チームの選手間で行われたパスのうち、 最も距離(ユークリッド距離)が長いものの距離と、それにかかった時間を求めることである。 距離が最長となるパスが複数ある場合は、かかった時間が最も短いものを出力せよ。

入力

入力は以下の形式で与えられる。t_i=0 のときA国、 t_i=1 のときB国を表す。

N
f_0 a_0 t_0 x_0 y_0
…
f_{N−1} a_{N−1} t_{N−1} x_{N−1} y_{N−1}

制約

入力はすべて整数である

1 \≤ N \≤ 100

0 \≤ f_i \lt f_{i+1} \≤ 324\,000

1 \≤ a_i \≤ 11

t_i = 0,1

0 \≤ x_i \≤ 120

0 \≤ y_i \≤ 90

出力

A国の最長のパスにかかった距離と時間、B国の最長のパスにかかった距離と時間を、それぞれ1行に出力せよ。時間は秒単位とし、距離、時間ともに 10^{−3} 以下の絶対誤差は許される。パスが一度も行われなかった場合はともに −1 と出力せよ。

サンプル

サンプル入力1

5
0 1 0 3 4
30 1 0 3 4
90 2 0 6 8
120 1 1 1 1
132 2 1 2 2

サンプル出力1

5.00000000 1.00000000
1.41421356 0.20000000

A国は長さ 5 のパスを 30 フレームの時刻に 60 フレーム =1 秒でし、B国は長さ √2 のパスを 120 フレームの時刻に 12 フレーム =0.2 秒でした。これらがそれぞれの最長のパスである。

サンプル入力2

2
0 1 0 0 0
10 1 1 0 0

サンプル出力2

-1 -1
-1 -1

サンプル入力3

3
0 1 0 0 0
30 2 0 1 1
40 1 0 2 2

サンプル出力3

1.4142135624 0.1666666667
-1 -1

サンプル入力4

3
0 1 0 0 0
10 2 0 1 1
40 1 0 3 3

サンプル出力4

2.8284271247 0.5000000000
-1 -1

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AOJ {
	class Program {
		static void Main(string[] args) {
			new Calc().Solve();

		}

		public class Calc {
			public class Player {
				public int F;
				public int A;
				public int T;
				public int X;
				public int Y;
				public Player(int f,int a,int t,int x,int y) {
					F = f; A = a;T = t;X = x;Y = y;
				}
				public bool IsSameTeam(Player p) {
					return this.T == p.T;
				}
				public double Distance(Player p) {
					return Math.Sqrt(Math.Pow(X - p.X, 2) + Math.Pow(Y - p.Y, 2));
				}
				public static double FrameToSecond(int f) {
					if (f == -1) return -1;
					return ((double)f / 60.0);
				}
			}
			public void Solve() {
				int N = Utils.GetInt();
				var list = new List<Player>();
				for (int i = 0; i < N; i++) {
					var line = Utils.GetLineInts();
					list.Add(new Player(line[0],line[1], line[2], line[3], line[4]));
				}
				int[] maxFrame = new int[2] { -1, -1 };
				double[] maxDistance = new double[2] { -1, -1 };
				for (int i = 0; i < N-1;i++) {
					if (!list[i].IsSameTeam(list[i + 1])) continue;
					int t = list[i].T;
					double nextdis = list[i].Distance(list[i + 1]);
					int nextFrame = list[i + 1].F - list[i].F;
					if (nextdis >= maxDistance[t]) {
						if ((nextdis == maxDistance[t] && nextFrame < maxFrame[t]) || nextdis > maxDistance[t]) {
							maxFrame[t] = nextFrame;
							maxDistance[t] = nextdis;
						}						
					}
				}
				if (maxDistance[0] == -1) "-1 -1".WL(); else Console.WriteLine("{0:F6} {1:F6}", maxDistance[0], Player.FrameToSecond(maxFrame[0]));
				if (maxDistance[1] == -1) "-1 -1".WL(); else Console.WriteLine("{0:F6} {1:F6}", maxDistance[1], Player.FrameToSecond(maxFrame[1]));
				return;
			}
		}
	}

	public static class Utils {
		public static int GetInt() {
			return int.Parse(Console.ReadLine());
		}
		public static long GetLong() {
			return long.Parse(Console.ReadLine());
		}
		public static void WL(this object obj) { Console.WriteLine(obj); }
		public static void WL(this string obj) {
			Console.WriteLine(obj);
		}
		public static void WL<T>(this IEnumerable<T> ie) {
			foreach (var item in ie) {
				item.WL();
			}
		}
		public static List<int> GetLineInts() {
			return Console.ReadLine().Split().Select(int.Parse).ToList();
		}
	}
}