Submission #24778992


Source Code Expand

(** val half : int -> int **)

let rec half = (Fun.flip ( lsr ) 1)

(** val climb : (int -> 'a1 -> 'a1) -> int -> int -> int -> 'a1 -> 'a1 **)

let rec climb climb2exp e p n v =
  (fun fO fS n -> if n = 0 then fO () else fS (n-1))
    (fun _ -> v)
    (fun e' ->
    let p' = half p in
    if ( <= ) (succ n) p'
    then climb climb2exp e' p' n v
    else climb climb2exp e' p' (( - ) n p') (climb2exp e' v))
    e

(** val bisect :
    ('a1 -> 'a1 -> bool) -> (int -> 'a1 -> 'a1) -> int -> 'a1 -> 'a1 -> 'a1 **)

let rec bisect eq_vertex climb2exp e u v =
  (fun fO fS n -> if n = 0 then fO () else fS (n-1))
    (fun _ -> climb2exp 0 u)
    (fun e' ->
    let u' = climb2exp e' u in
    let v' = climb2exp e' v in
    if eq_vertex u' v'
    then bisect eq_vertex climb2exp e' u v
    else bisect eq_vertex climb2exp e' u' v')
    e

(** val lca_aux :
    ('a1 -> 'a1 -> bool) -> (int -> 'a1 -> 'a1) -> int -> 'a1 -> 'a1 -> 'a1 **)

let lca_aux eq_vertex climb2exp e u v =
  if eq_vertex u v then u else bisect eq_vertex climb2exp e u v

(** val lca :
    ('a1 -> 'a1 -> bool) -> ('a1 -> int) -> (int -> 'a1 -> 'a1) -> int -> int
    -> 'a1 -> 'a1 -> 'a1 **)

let lca eq_vertex height climb2exp e p u v =
  if ( <= ) (height u) (height v)
  then lca_aux eq_vertex climb2exp e u
         (climb climb2exp e p (( - ) (height v) (height u)) v)
  else lca_aux eq_vertex climb2exp e v
         (climb climb2exp e p (( - ) (height u) (height v)) u)

let bits = 62

let () = Scanf.scanf "%d\n" @@ fun n ->
  let es = Array.make n [] in
  for i = 0 to n - 2 do
    Scanf.scanf "%d %d\n" @@ fun x y ->
      es.(x - 1) <- y - 1 :: es.(x - 1);
      es.(y - 1) <- x - 1 :: es.(y - 1)
  done;
  let hs = Array.make n max_int in
  let pss = Array.make_matrix bits n 0 in
  let rec visit h u v =
    if h < hs.(v) then (
      hs.(v) <- h;
      pss.(0).(v) <- u;
      List.iter (visit (h + 1) v) es.(v)
    ) in
  visit 0 0 0;
  for i = 0 to bits - 2 do
    for v = 0 to n - 1 do
      pss.(i + 1).(v) <- pss.(i).(pss.(i).(v))
    done
  done;
  Scanf.scanf "%d\n" @@ fun q ->
    for i = 0 to q - 1 do
      Scanf.scanf "%d %d\n" @@ fun a b ->
        Printf.printf "%d\n" @@
        1 + hs.(a - 1) + hs.(b - 1) - 2 * hs.(lca ( = ) (Array.get hs) (fun i v -> pss.(i).(v)) bits (1 lsl bits) (a - 1) (b - 1))
    done

Submission Info

Submission Time
Task D - 閉路
User fetburner
Language OCaml (4.10.0)
Score 100
Code Size 2381 Byte
Status AC
Exec Time 607 ms
Memory 69508 KiB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 3
AC × 12
AC × 27
Set Name Test Cases
Sample subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt
Subtask2 subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Case Name Status Exec Time Memory
subtask0_sample01.txt AC 7 ms 3800 KiB
subtask0_sample02.txt AC 2 ms 3772 KiB
subtask0_sample03.txt AC 2 ms 3820 KiB
subtask1_01.txt AC 129 ms 69448 KiB
subtask1_02.txt AC 126 ms 69408 KiB
subtask1_03.txt AC 5 ms 3700 KiB
subtask1_04.txt AC 2 ms 3936 KiB
subtask1_05.txt AC 6 ms 4868 KiB
subtask1_06.txt AC 4 ms 4824 KiB
subtask1_07.txt AC 161 ms 62212 KiB
subtask1_08.txt AC 157 ms 62248 KiB
subtask1_09.txt AC 157 ms 62312 KiB
subtask1_10.txt AC 156 ms 62264 KiB
subtask1_11.txt AC 158 ms 62304 KiB
subtask1_12.txt AC 159 ms 62260 KiB
subtask2_01.txt AC 209 ms 69508 KiB
subtask2_02.txt AC 206 ms 69476 KiB
subtask2_03.txt AC 126 ms 5928 KiB
subtask2_04.txt AC 155 ms 5984 KiB
subtask2_05.txt AC 199 ms 6520 KiB
subtask2_06.txt AC 181 ms 6436 KiB
subtask2_07.txt AC 591 ms 62380 KiB
subtask2_08.txt AC 607 ms 62416 KiB
subtask2_09.txt AC 580 ms 62344 KiB
subtask2_10.txt AC 592 ms 62348 KiB
subtask2_11.txt AC 580 ms 62316 KiB
subtask2_12.txt AC 578 ms 62424 KiB