結果
| 問題 |
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 ()
)