ABC 378

ABC 378 に参加しました。レーティング微減です。

Table 1: Diff 予想
問題 A 問題 B 問題 C 問題 D 問題 E 問題 F 問題
提出 AC AC AC AC TLE AC
Diff 予想 10 20 400 800 1,500 1,100
Diff 実際 22 118 191 587 1,406 1,436

A 問題

同じ色のボールを 2 つずつ捨てていくとき、捨てられるペアの数を求めよ。色ごとにボールの数を数えて 2 で割った和が答えです。

import Data.List;main=interact$show.sum.map((`div`2).length).group.sort.map(read @Int).words

B 問題

ゴミが定期的に収集されるとき、最寄りのゴミ収集日を求めよ。愚直に分岐するのが簡単だと思います。

let !d' = d `mod` q
(d +) $ case compare d' r of
  EQ -> 0
  GT -> r + q - d'
  LT -> r - d'

C 問題

数列を走査するとき、それぞれの \(A_i\) と同じ値が出現した最寄りの位置を求めよ。 Map を持って数列を走査します。

mapAccumL 案件ですが、 vector には無いので State モナドを使いました:

let !res = (`evalState` IM.empty) $ U.imapM (\i x -> state (step i x)) xs
      where
        -- step :: i -> x -> state -> (x', state)
        step (succ -> i) x im = case IM.lookup x im of
          Just i' -> (i', im')
          Nothing -> (-1, im')
          where
            !im' = IM.insert x i im

上のコードの提出は、 mapAccumL よりも 100 ms 程度遅かったです。 mapM + State は遅い! cojna さんの mapAccum を借りると mapAccumL と同速程度に速くなります。

D 問題

グリッド上で長さ K の 単純道 (頂点の重複が無いパス) の数を求めよ。愚直解が通ります。大雑把に見積もると \(O(HW \cdot N!)\) は TLE しますが、もう少し正確に考えると \(O(HW \cdot 4 \cdot 3^{K-1})\) になります (公式解説) 。

この DFS は大まかに次の形で実装できます:

!dist <- UM.replicate (h * w) undef
(\f -> fix f (0 :: Int) source) $ \loop d1 v1 -> do
  GM.write dist v1 d1    -- 訪問済みにする
  -- 隣接頂点を調べる、など (省略)
  GM.write dist v1 undef -- 未訪問にする

計算量の見積もりを間違えました。順位表を見るとペナルティの数が少なかったため、メタ読みで愚直解が通ると分かりました。

E 問題

数列 \(\{A_i\}_i\) に対し \(\sum\limits_{1 \le l \le r \le N} {(\sum\limits_{l \le i \le r}A_i \bmod M)}\) を求めよ。考察中……

F 問題

木に対し 1 つの辺を追加し閉路を作る。閉路中の頂点がすべて次数 3 となり、かつ単純グラフのままである (重複辺ではない) 辺の張り方の数を求めよ。

辺の追加によって次数が増加します。閉路に含まれる頂点が (次数 2, 次数 3, 次数 3, .., 次数 2) となる辺の張り方の数が答えです。次数 3 の頂点の『島』を Union-Find で作って解答しました。

Make Bipartite 2 よりも簡単な気がしますが、こちらは水 diff になりました。

感想

今回もレーティングが減少しました。維持には速解きが必要です。

東京観光

アーユル・チェアー

アーユル・チェアー に座ってきました。座っている間は何ともないですが、 立つ時の負荷がほぼ無い のが印象的でした。ちょっと気持ち良かったぐらいです。次のセール・ポイント還元では買いです。

高級モデルも座席部分は変わりません。高さのみが変わるようです。

Bang & Olufsen

高級オーディメーカの B&O で空間オーディオや 15 万円のヘッドフォンを体験して来ました。耳が悪いのか、自宅の装備とあまり差が分かりません。

自宅装備は HS5 - YAMAHAが最強である理由 / レビュー と大体同じ (HS5 + FOSTEX のヘッドフォン) です。これ以上、もう上は無いのか……?

インターネットカフェ

入店・退店処理が無人で、ちょっとしたホテルのような内装も印象的でした。シャワーもあります。もうホテルに宿泊しないかもしれません。

東京Emacs勉強会 オクトーバーフェスティバル2024

登壇の機会を頂きました。こういう機会でも無いとオフラインイベントには参加しませんものね。本当にありがたかったです。

もっとも、発表は大失敗でした。めちゃめちゃフォローして頂いて、申し訳ない気持ちばかりです。せっかく話しかけてもらっても、マクロは LSP と相性が悪いので興味無いっすとか言っちゃって、何やってんだろう……。

現地で得た情報としては、以下を真似したいです。特に dmacro が面白い。

懇親会では、主に Lisp に関する異常に詳しい話を伺いました。圧巻でした。実質 Lisp 博物館で、こうなりたいものです。

技能習得に興味があり、 Lisp を実装したとしても Lisp を理解したとは限らない、型システムを実装したからと言って型システムを理解したとは限らない、といった話をしてもらえたのが嬉しかったです。