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 JAVA (judge verdict: Accepted)

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
	Scanner in = new Scanner(System.in);
	public static void main(String[] args) {
		new Main();
	}
	public Main() {
		new RitProA().doIt();
	}
	class RitProA{
		void doIt(){
			int n = in.nextInt();
			ArrayList<Frame> list = new ArrayList<Frame>();
			for(int i=0;i<n;i++)list.add(new Frame(in.nextInt(),in.nextInt(), in.nextInt(), in.nextInt(), in.nextInt()));
			Collections.sort(list);
			
			double maxKyori1 = -1.000000;
			int minTime1 = Integer.MAX_VALUE/2;
			double maxKyori2 = -1.000000;
			int minTime2 = Integer.MAX_VALUE/2;
			for(int i=0;i<n-1;i++){
				Frame f1 = list.get(i);
				Frame f2 = list.get(i+1);
				Point2D p1 = new Point2D.Double(f1.x,f1.y);
				Point2D p2 = new Point2D.Double(f2.x,f2.y);
				if(f1.t!=f2.t)continue;
				if(f1.t == 0){
					if(p1.distance(p2) > maxKyori1 && f1.a != f2.a){
						maxKyori1 = p1.distance(p2)*1.000000;
						minTime1 = f2.f - f1.f;
					}else if(Math.abs(p1.distance(p2) - maxKyori1) < 0.00000000001){
						maxKyori1 = p1.distance(p2)*1.000000;
						minTime1 = f2.f - f1.f;
					}
				}else{
					if(p1.distance(p2) >= maxKyori2 && f1.a != f2.a){
						maxKyori2 = p1.distance(p2)*1.000000;
						minTime2 = f2.f - f1.f;
					}else if(Math.abs(p1.distance(p2) - maxKyori2) < 0.00000000001){
							maxKyori2 = p1.distance(p2)*1.000000;
							minTime2 = f2.f - f1.f;
					}
				}
			}
			if(maxKyori1 == -1.0){
				System.out.println("-1 -1");
			}else System.out.printf("%.5f %.5f\n",maxKyori1,minTime1/60.0);
			if(maxKyori2 == -1.0)System.out.println("-1 -1");
			else System.out.printf("%.5f %.5f\n",maxKyori2,minTime2/60.0);
		}
	}
	
	class Frame implements Comparable<Frame>{
		int a,t,x,y,f;
		public Frame(int _f,int _a,int _t,int _x,int _y){
			this.f = _f;
			this.x = _x;
			this.y = _y;
			this.a = _a;
			this.t = _t;
		}
		public int compareTo(Frame f) {
			return this.f - f.f;
		}
		
		
	}
}