競技プログラミング
訓練
Keyball 44 で 寿司打 をやっていた。僕は何を‥‥
ミスせずタイピングを継続すると、追加でボーナス時間が与えられる。このためタイプミスを大幅に減らす訓練になった。現在のスコアは 30 皿 12,000 円を安定して超える程度。あまり速くないみたい。
ABC 329
ABC 329 に参加した。寿司打をやった意味があるほどタイピングしなかった。
本番
A 問題 ではお手本のような手続き型プログラミングを行った。酷いよ。
main :: IO ()
main = do
!s <- BS.getLine
forM_ (BS.unpack (BS.init s)) $ \ch -> do
putChar ch
putChar ' '
putChar (BS.last s)
B 問題 では降順ソートして uniq
を取ったら 2 番目の要素が答えとなる。
C 問題 は U.accumulate
で解いた。 U.accumulate
の引数は U.accumulate op initialVec commands
という形で accumArray
とやや異なる。
D 問題 ではヒープを使ってしまったが、最大値を持って mapAccumL
すれば良かった。セグメント木に Max (Int, Down Int)
を載せると、区間クエリの問題であっても対応できるとのこと。なるほど。
Upsolve
E 問題 では時系列を遡ると貪欲に解ける。すなわち元の文字列に対して # を塗っていくと、 # で覆った部分は上書きされるようになるため、 # になった箇所はワイルドカードであると見做せる。
後は一度塗った箇所の近辺を再度見直すために、キューやスタックを使用する。この辺のディテールも実装力ということか。
タイムラインでは、 左右に 1 回ずつ走査すれば良いのではないか という解法が流れてきた。実に ARC 的な解答だ。
gksato 氏の提出 においては可変配列が出現せず、 DP で解いている。ビット列を持って scanl した後に tail と last を見ているが……? まだ基本的なアイデアを読み取れていない。
F 問題 では ABC 279 F からの連想で union-find を使ってしまい失敗した。 Set
を使うと指示通りシミュレーションするだけとなった。
F 問題でよく聞くマージテクとは、 union-find における union by rank とか union by size と同じ話で、極端にバランスの崩れた木を作らないように工夫することが、最悪計算量を均すことに繋がる。
なお Set
においてはマージテクが自動適用される (たぶん) ほか、 IntSet
は深さ 64 の完全二分木を圧縮した形であるため、あまり Haskell では使わないテクニックかもしれない。
Haskell 本
表紙、完成
ラフから 2 週間で完成品を納入頂いた。見合った内容目指して頑張るぞい!
進捗: 8%
ニッチな疑問が尽きず進捗が芳しくない。最近の収穫で言うと、
- haddock の
$setup
で型のdefault
を指定すればdoctest
から(0 :: Int)
のような型表記を省略できる - Boxed な
Vector
は GC だけではなく MUT も長いのはなぜか
未解決 (質問するかも) - 計算過程の
IntMap
をすべて vector に保存すると GC が長い (MUT は変わらない)
茶色コーダーを目指すための tips からはかけ離れてきた。すべて載せるスタイルに方向展開したい。
Misc
Vim Conf 2023 Tiny
カンファレンスをやっていたみたい。楽しそうでいいな。