AtCoder の問題を解くための fypp ソースコード. GFortran, fypp を使うことを想定.
-
src/以下のファイルspecial.fyppを#:include "filepath/special.fypp"で読み込む. -
src/以下のファイルを見てみる. 例えばtuple2を使うときはsrc/tuple2_m.fyppの先頭のコメントで, どのような fypp の変数を定義すればよいかが分かる. -
例 (
#で始まるものは fypp の命令.)
#:include "src/special.fypp"
#:set TUPLE2_ITEM1_TYPES = ["integer"]
#:set TUPLE2_ITEM2_TYPES = ["integer"]
#:set TUPLE2_ITEM1_KINDS = ["int32"]
#:set TUPLE2_ITEM2_KINDS = ["int32"]
#:set TUPLE2_USE_MODULES = []
#:include "src/tuple2_m.fypp"
#:set UNWRAPPED_VECTOR_ITEM_TYPES = ["type"]
#:set UNWRAPPED_VECTOR_ITEM_KINDS = ["tuple2_int32_int32"]
#:set UNWRAPPED_VECTOR_USE_MODULES = ["tuple2_m"]
#:include "src/unwrapped_vector_m.fypp"
program ${PROGNAME}$
use, intrinsic :: iso_fortran_env
${USE_STATEMENT}$
implicit none
end program ${PROGNAME}$
として, fypp で処理すると tuple2 の vector を生成できる.
$ fypp -m random -m os sample.fypp
-m random と -m os を失くすには, src/special.fypp の PROBABILITY 変数と PROGNAME 変数を書き変える.
- 可変長配列
src/unwrapped_vector_m.fypp. - 可変長文字
src/vec_string_m.fypp.s%read(input_unit)で任意の長さの入力を扱える.
- merge sort
src/merge_sort_m.fypp. - tuple2
src/tuple2_m.fypp. - tuple3
src/tuple3_m.fypp. - modint
src/modint_m.fypp. - 座標圧縮
src/coordinate_compress_m.fypp.merge_sort_mも必要.
- union find
src/union_find_m.fypp. - deque
src/vec_deque_m.fypp. - 優先度付きキュー
src/priority_queue_m.fypp. - B木
src/btree_m.fypp.- キーは比較可能でなければならない. 組込み型(integer, realなど)はキーに使える.
- 自作の型については
src/attr_ordering.fyppを見る.
- 抽象化セグメント木
src/segment_tree_m.fypp.monoid_op_*型を継承すれば, 自作のモノイドを載せることが可能.
- 抽象化遅延伝播セグメント木
src/lazy_segment_tree_m.fypp.- こちらも
monoid_*_lazy_*型を継承すれば, 自作のモノイドを載せることが可能.
- こちらも
- Hash Map
- B木を使えばよいので, モチベーションは低い.