提出 #346409


ソースコード 拡げる

let pf = Printf.printf ;;
let epf = Printf.eprintf ;;
let sf = Scanf.scanf ;;

let (|>) x f = f x ;;
let (@@) f x = f x ;;

module Array = struct
  include ArrayLabels
  let foldi ~f ~init arr =
    let acc = ref init in
    for i = 0 to Array.length arr - 1 do
      acc := f i !acc arr.(i)
    done;
    !acc
  ;;

  let findi arr ~f =
    let len = Array.length arr in
    let rec iter i =
      if i = len then None
      else if f arr.(i) then Some i
      else iter (i + 1) in
    iter 0
  ;;

  let findi_exn arr ~f =
    let len = Array.length arr in
    let rec iter i =
      if i = len then None
      else if f arr.(i) then Some i
      else iter (i + 1) in
    iter 0
  ;;

  (* i ∈ [0..res) -> not (f i) /\ i ∈ [res, len) -> f i *)
  let lower_bound arr ~f =
    let l, h = 0, Array.length arr in
    (* res ∈ (l, h] *)
    let rec iter l h =
      if l = h - 1 then h
      else 
        let m = (l + h) lsr 1 in
        if f m then iter l m
        else iter m h in
    iter l h
  ;;

  (* i ∈ [0..res] -> f i /\ i ∈ (res, len) -> not (f i) *)
  let upper_bound arr ~f =
    let l, h = 0, Array.length arr in
    (* res ∈ [l, h) *)
    let rec iter l h =
      if l = h - 1 then l
      else 
        let m = (l + h) lsr 1 in
        if f m then iter m h
        else iter l m in
    iter l h
  ;;
end
  
module String = StringLabels ;;
module List  = struct
  include ListLabels ;;
  let rec repeat n a = if n = 0 then [] else a :: repeat (n - 1) a ;;
  let rec drop n a =
    if n = 0 then a
    else match a with
    | [] -> failwith "cannot take"
    | x :: xs -> drop (n - 1) xs ;;

  let init ~f n =
    let res = ref [] in
    for i = 0 to n - 1 do
      res := f i :: !res
    done;
    List.rev !res
  ;;
end ;;
module H = Hashtbl ;;

let c = ref ' ' ;;
let is_num c = '0' <= c && c <= '9' ;;
let is_space c = c = ' ' || c = '\n' || c = '\t' ;;
let to_num c = Char.code c - Char.code '0' ;;
let read_char () = input_char stdin ;;

let next_int () =
  while is_space !c do
    c := read_char () ;
  done;
  let ok = ref false in
  let acc = ref 0 in
  while is_num !c do
    ok := true;
    acc := !acc * 10 + to_num !c;
    c := read_char ();
  done;
  if !ok then !acc
  else raise (Failure "next_int")
;; 

let rec div2iter n = 
  if n mod 2 = 0 then div2iter (n / 2)
  else n
;;

module SI = Set.Make (struct
  type t = int 
  let compare x y = compare (div2iter x) (div2iter y)
end)

let solve n xs =
  pf "%d\n" (SI.cardinal @@ Array.fold_left xs ~init:SI.empty ~f:(fun acc x -> SI.add x acc))
;;

let () = sf "%d " (fun n -> solve n @@ Array.init n ~f:(fun _ -> sf "%d " (fun x -> x)))

提出情報

提出日時
問題 C - 高橋くんと魔法の箱
ユーザ iab
言語 OCaml (3.12.1)
得点 100
コード長 2747 Byte
結果 AC
実行時間 334 ms
メモリ 11248 KiB

ジャッジ結果

セット名 Sample Subtask1 Subtask2 All
得点 / 配点 0 / 0 20 / 20 30 / 30 50 / 50
結果
AC × 3
AC × 23
AC × 13
AC × 43
セット名 テストケース
Sample subtask0_0.txt, subtask0_1.txt, subtask0_2.txt
Subtask1 subtask1_0.txt, subtask1_1.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_2.txt, subtask1_3.txt, subtask1_4.txt, subtask1_5.txt, subtask1_6.txt, subtask1_7.txt, subtask1_8.txt, subtask1_9.txt, subtask0_0.txt, subtask0_1.txt, subtask0_2.txt
Subtask2 subtask2_0.txt, subtask2_1.txt, subtask2_2.txt, subtask2_3.txt, subtask2_4.txt, subtask2_5.txt, subtask2_6.txt, subtask2_7.txt, subtask2_8.txt, subtask2_9.txt, subtask0_0.txt, subtask0_1.txt, subtask0_2.txt
All subtask0_0.txt, subtask0_1.txt, subtask0_2.txt, subtask1_0.txt, subtask1_1.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_2.txt, subtask1_3.txt, subtask1_4.txt, subtask1_5.txt, subtask1_6.txt, subtask1_7.txt, subtask1_8.txt, subtask1_9.txt, subtask2_0.txt, subtask2_1.txt, subtask2_2.txt, subtask2_3.txt, subtask2_4.txt, subtask2_5.txt, subtask2_6.txt, subtask2_7.txt, subtask2_8.txt, subtask2_9.txt, subtask3_0.txt, subtask3_1.txt, subtask3_2.txt, subtask3_3.txt, subtask3_4.txt, subtask3_5.txt, subtask3_6.txt, subtask3_7.txt, subtask3_8.txt, subtask3_9.txt
ケース名 結果 実行時間 メモリ
subtask0_0.txt AC 25 ms 924 KiB
subtask0_1.txt AC 23 ms 916 KiB
subtask0_2.txt AC 23 ms 804 KiB
subtask1_0.txt AC 28 ms 2976 KiB
subtask1_1.txt AC 29 ms 3100 KiB
subtask1_10.txt AC 28 ms 2976 KiB
subtask1_11.txt AC 30 ms 2976 KiB
subtask1_12.txt AC 30 ms 2988 KiB
subtask1_13.txt AC 30 ms 2992 KiB
subtask1_14.txt AC 28 ms 2976 KiB
subtask1_15.txt AC 30 ms 2972 KiB
subtask1_16.txt AC 30 ms 2980 KiB
subtask1_17.txt AC 30 ms 2968 KiB
subtask1_18.txt AC 30 ms 3100 KiB
subtask1_19.txt AC 31 ms 2984 KiB
subtask1_2.txt AC 29 ms 2980 KiB
subtask1_3.txt AC 31 ms 2988 KiB
subtask1_4.txt AC 29 ms 2988 KiB
subtask1_5.txt AC 31 ms 2968 KiB
subtask1_6.txt AC 35 ms 3120 KiB
subtask1_7.txt AC 29 ms 2976 KiB
subtask1_8.txt AC 29 ms 3104 KiB
subtask1_9.txt AC 33 ms 2928 KiB
subtask2_0.txt AC 188 ms 7600 KiB
subtask2_1.txt AC 308 ms 10156 KiB
subtask2_2.txt AC 322 ms 10280 KiB
subtask2_3.txt AC 317 ms 10136 KiB
subtask2_4.txt AC 304 ms 10140 KiB
subtask2_5.txt AC 297 ms 10148 KiB
subtask2_6.txt AC 303 ms 10280 KiB
subtask2_7.txt AC 292 ms 10152 KiB
subtask2_8.txt AC 296 ms 10152 KiB
subtask2_9.txt AC 288 ms 10148 KiB
subtask3_0.txt AC 151 ms 7576 KiB
subtask3_1.txt AC 308 ms 11164 KiB
subtask3_2.txt AC 334 ms 11172 KiB
subtask3_3.txt AC 318 ms 11172 KiB
subtask3_4.txt AC 334 ms 11112 KiB
subtask3_5.txt AC 303 ms 10916 KiB
subtask3_6.txt AC 324 ms 10924 KiB
subtask3_7.txt AC 320 ms 11248 KiB
subtask3_8.txt AC 322 ms 11172 KiB
subtask3_9.txt AC 332 ms 10912 KiB