提出 #32140388
ソースコード 拡げる
module SegtreeQueries = struct
(** val product_rec' :
('a1 -> 'a1 -> 'a1) -> (int -> 'a1) -> int -> int -> int -> int
-> 'a1 -> 'a1 -> 'a1 **)
let rec product_rec' mul x x0 x1 x2 x3 x4 x5 =
if ( <= ) x3 x2
then mul x4 x5
else product_rec' mul x ((fun n -> n / 2) x0) (( + ) x1 x0)
((fun n -> (n + 1) / 2) x2) ((fun n -> n / 2) x3)
(if (fun n -> 0 < n mod 2) x2
then mul x4 (x (( + ) x1 x2))
else x4)
(if (fun n -> 0 < n mod 2) x3
then mul (x (( + ) x1 (pred x3))) x5
else x5)
(** val product' :
'a1 -> ('a1 -> 'a1 -> 'a1) -> (int -> 'a1) -> int -> int -> int
-> 'a1 **)
let product' idm mul segtree m l r =
product_rec' mul segtree m 0 l r idm idm
(** val upper_bound_rec' :
('a1 -> 'a1 -> 'a1) -> 'a1 pred -> (int -> 'a1) -> int -> int
-> int -> int -> int -> 'a1 -> (int -> 'a1 -> 'a2) -> 'a2 **)
let rec upper_bound_rec' mul p segtree i m n l r p0 cont =
(fun fO fS n -> if n=0 then fO () else fS (n-1))
(fun _ -> cont l p0)
(fun i0 ->
if ( <= ) r l
then cont l p0
else let p' =
if (fun n -> 0 < n mod 2) l
then mul p0 (segtree (( + ) n l))
else p0
in
if if (fun n -> 0 < n mod 2) l then not (p p') else false
then cont l p0
else upper_bound_rec' mul p segtree i0
((fun n -> n / 2) m) (( + ) n m)
((fun n -> (n + 1) / 2) l) ((fun n -> n / 2) r) p'
(fun k p1 ->
if ( <= ) r ((fun n -> n + n) k)
then cont ((fun n -> n + n) k) p1
else let p'0 =
mul p1
(segtree (( + ) n ((fun n -> n + n) k)))
in
if p p'0
then cont (succ ((fun n -> n + n) k)) p'0
else cont ((fun n -> n + n) k) p1))
i
(** val upper_bound' :
'a1 -> ('a1 -> 'a1 -> 'a1) -> 'a1 pred -> (int -> 'a1) -> int
-> int -> int -> int * 'a1 **)
let upper_bound' idm mul p segtree m l r =
upper_bound_rec' mul p segtree m m 0 l r idm (fun x x0 -> (x, x0))
(** val lower_bound_rec' :
('a1 -> 'a1 -> 'a1) -> 'a1 pred -> (int -> 'a1) -> int -> int
-> int -> int -> int -> 'a1 -> (int -> 'a1 -> 'a2) -> 'a2 **)
let rec lower_bound_rec' mul p segtree i m n l r p0 cont =
(fun fO fS n -> if n=0 then fO () else fS (n-1))
(fun _ -> cont r p0)
(fun i0 ->
if ( <= ) r l
then cont r p0
else let p' =
if (fun n -> 0 < n mod 2) r
then mul (segtree (( + ) n (pred r))) p0
else p0
in
if if (fun n -> 0 < n mod 2) r then not (p p') else false
then cont r p0
else lower_bound_rec' mul p segtree i0
((fun n -> n / 2) m) (( + ) n m)
((fun n -> (n + 1) / 2) l) ((fun n -> n / 2) r) p'
(fun k p1 ->
if ( <= ) ((fun n -> n + n) k) l
then cont ((fun n -> n + n) k) p1
else let p'0 =
mul
(segtree
(( + ) n (pred ((fun n -> n + n) k)))) p1
in
if p p'0
then cont (pred ((fun n -> n + n) k)) p'0
else cont ((fun n -> n + n) k) p1))
i
(** val lower_bound' :
'a1 -> ('a1 -> 'a1 -> 'a1) -> 'a1 pred -> (int -> 'a1) -> int
-> int -> int -> int * 'a1 **)
let lower_bound' idm mul p segtree m l r =
lower_bound_rec' mul p segtree m m 0 l r idm (fun x x0 -> (x, x0))
end
module Segtree = struct
module type Monoid = sig
type t
val e : t
val op : t -> t -> t
end
module Make (M : Monoid) = struct
type elt = M.t
type t = elt array
let make m = Array.make (2 * m) M.e
let leaves segtree = Array.length segtree / 2
let rec initialize_ancestors i j n d =
if 0 < n then begin
for k = 0 to n - 1 do
d.(i + k) <- M.op d.(j + 2 * k) d.(j + 2 * k + 1)
done;
initialize_ancestors (i + n) i (n / 2) d
end
let of_list l =
let segtree = make (List.length l) in
List.iteri (Array.set segtree) l;
initialize_ancestors (leaves segtree) 0 (leaves segtree / 2) segtree;
segtree
let init m f =
let segtree = make m in
for i = 0 to m - 1 do
segtree.(i) <- f i
done;
initialize_ancestors m 0 (m / 2) segtree;
segtree
let product segtree = SegtreeQueries.product' M.e M.op (Array.get segtree) (leaves segtree)
let upper_bound segtree l r p = SegtreeQueries.upper_bound' M.e M.op p (Array.get segtree) (leaves segtree) l r
let lower_bound segtree l r p = SegtreeQueries.lower_bound' M.e M.op p (Array.get segtree) (leaves segtree) l r
let rec update_ancestors i j k n d =
if k < n then begin
d.(i + k) <- M.op d.(j + 2 * k) d.(j + 2 * k + 1);
update_ancestors (i + n) i (k / 2) (n / 2) d
end
let update segtree i f =
segtree.(i) <- f segtree.(i);
update_ancestors (leaves segtree) 0 (i / 2) (leaves segtree / 2) segtree
end
end
module SumSegtree = Segtree.Make (struct
type t = int
let e = 0
let op = ( + )
end)
let () = Scanf.scanf "%d\n" @@ fun q ->
let segtree = SumSegtree.make 200001 in
for i = 0 to q - 1 do
Scanf.scanf "%d %d\n" @@ fun t x ->
match t with
| 1 -> SumSegtree.update segtree x succ;
| 2 ->
let (n, _) = SumSegtree.upper_bound segtree 0 200001 (fun sum -> sum < x) in
Printf.printf "%d\n" n;
SumSegtree.update segtree n pred;
done
提出情報
| 提出日時 | |
|---|---|
| 問題 | C - データ構造 |
| ユーザ | fetburner |
| 言語 | OCaml (4.10.0) |
| 得点 | 100 |
| コード長 | 6009 Byte |
| 結果 | AC |
| 実行時間 | 179 ms |
| メモリ | 9372 KiB |
コンパイルエラー
File "./Main.ml", lines 168-173, characters 6-43: 168 | ......match t with 169 | | 1 -> SumSegtree.update segtree x succ; 170 | | 2 -> 171 | let (n, _) = SumSegtree.upper_bound segtree 0 200001 (fun sum -> sum < x) in 172 | Printf.printf "%d\n" n; 173 | SumSegtree.update segtree n pred; Warning 8: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: 0
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 100 / 100 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | sample_01.txt, sample_02.txt |
| All | sample_01.txt, sample_02.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, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| sample_01.txt | AC | 11 ms | 6972 KiB |
| sample_02.txt | AC | 6 ms | 7012 KiB |
| subtask1_01.txt | AC | 9 ms | 6952 KiB |
| subtask1_02.txt | AC | 8 ms | 6976 KiB |
| subtask1_03.txt | AC | 8 ms | 7104 KiB |
| subtask1_04.txt | AC | 25 ms | 9052 KiB |
| subtask1_05.txt | AC | 42 ms | 9228 KiB |
| subtask1_06.txt | AC | 12 ms | 7492 KiB |
| subtask1_07.txt | AC | 92 ms | 9220 KiB |
| subtask1_08.txt | AC | 178 ms | 9292 KiB |
| subtask1_09.txt | AC | 179 ms | 9328 KiB |
| subtask1_10.txt | AC | 141 ms | 9232 KiB |
| subtask1_11.txt | AC | 139 ms | 9240 KiB |
| subtask1_12.txt | AC | 89 ms | 9060 KiB |
| subtask1_13.txt | AC | 179 ms | 9296 KiB |
| subtask1_14.txt | AC | 176 ms | 9292 KiB |
| subtask1_15.txt | AC | 152 ms | 9276 KiB |
| subtask1_16.txt | AC | 128 ms | 9372 KiB |