A15 - Compression

入出力

1
2
3
let N = stdin.ReadLine() |> int
let Aa = stdin.ReadLine().Split() |> Array.map int
solve N Aa |> Array.map string |> String.concat " " |> stdout.WriteLine

方針

問題を分解して考えます. まず対処すべきは指定通りの要素の順序づけです. 同じ値を持つ要素があるため一意化した上でソートすればよいでしょう. あとは値と順番に対する辞書を作り, 逆引きして要素に順番を割り当てれば求める結果が得られます.

解説

方針で書いた通りに関数を積めば終わりです.

1
2
3
  let flip (a,b) = (b,a)
  let Xm = Aa |> Array.distinct |> Array.sort |> Array.indexed |> Array.map flip |> Map
  Aa |> Array.map (fun x -> Xm.[x]+1)