結果
問題 | No.2740 Old Maid |
ユーザー |
|
提出日時 | 2024-04-20 20:35:35 |
言語 | OCaml (5.2.1) |
結果 |
AC
|
実行時間 | 551 ms / 2,000 ms |
コード長 | 1,118 bytes |
コンパイル時間 | 818 ms |
コンパイル使用メモリ | 22,016 KB |
実行使用メモリ | 41,472 KB |
最終ジャッジ日時 | 2024-10-12 18:41:52 |
合計ジャッジ時間 | 15,833 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 62 |
ソースコード
Scanf.scanf "%d" (fun n -> let pos = Array.make (n + 1) 0 in let module S = Set.Make (struct type t = int * int let compare = compare end) in let rec loop i set = if i = n then set else loop (i + 1) (Scanf.scanf " %d" (fun v -> pos.(v) <- i; S.add (i, v) set)) in let set = loop 0 S.empty in let rec loop rest mi q set = if rest = 0 then List.rev q else if pos.(mi) < 0 then loop rest (mi + 1) q set else let p = pos.(mi) in let _, _, r = S.split (p, mi - 1) set in let c0, v0 = S.min_elt r in let r = S.remove (c0, v0) r in if S.is_empty r then loop rest (mi + 1) q set else let c1, v1 = S.min_elt r in let set = S.remove (c0, v0) set in let set = S.remove (c1, v1) set in let () = pos.(v0) <- -1 in let () = pos.(v1) <- -1 in loop (rest - 2) mi (v1 :: v0 :: q) set in let q = loop n 1 [] set in List.iter (Printf.printf "%d ") q; print_newline () )