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

# frame, ティツδ古ァツ閉ェテ・ツ渉キ, テ」ツδ?」ツδシテ」ツδ?x, y

def distance(x, y, x2, y2)
  Math.sqrt( ( (x - x2) ** 2 + (y - y2) ** 2 ) )
end

def result_sort(pass)
  pass.sort!{|a, b|
    if a[:distance] != b[:distance]
      b[:distance] <=> a[:distance]
    else
      a[:time] <=> b[:time]
    end
  }
end

def solve(data)
  pass = {0.0 => [], 1.0 => []}
  (0 .. data.length - 2).each{|i|
    if data[i][2] == data[i + 1][2] && data[i][1] != data[i + 1][1]
      pass[ data[i][2] ].push({
        :team     => data[i][2],
        :time     => ( data[i + 1][0] - data[i][0] ) * (1.0 / 60.0),
        :distance => distance(data[i][3], data[i][4], data[i + 1][3], data[i + 1][4]),
      })
    end
  }
  result_sort pass[0.0]
  result_sort pass[1.0]
  pass
end

def main
  n = gets.to_i
  data = (0 .. n - 1).map{|n|
    STDIN.gets.split(" ").map{|x| x.to_f }
  }
  result = solve(data)
  puts result[0.0].empty? ? "-1 -1" : "#{ result[0.0][0][:distance] } #{ result[0.0][0][:time] }"
  puts result[1.0].empty? ? "-1 -1" : "#{ result[1.0][0][:distance] } #{ result[1.0][0][:time] }"
end

main