円形をしていて、その外周に道が通っている。1つの道上に2つ以上の噴水が置かれていることはない。移動するための最短距離を求めよ。公式の解説図は以下の通り。最短経路ということで、まずx正方向とy正方向に移動することだけ考えればいい。対頂角とする長方形に入っていない噴水は無視していいことがわかる。いったルートの中で、できるだけ多く噴水で曲がるようなルートを探すことを考える。任意の2つがこれを満たすような最大の噴水の組を見つけて、その回数分だけ噴水で曲がるとして答えを計算すればいい。Tree(BIT)を使えばいい。小さい方から順に噴水を追加していく。おけるvalueとして、BITを更新するわかりにくいと思うが、上のBITは「噴水のY座標」をkey「その噴水を通る時点で最も多く曲がれる回数」をvalueとして保持している。ちなみに制約からY座標をそのままkeyにすることは難しい。これを解決するために、一旦Y座標について座標圧縮を行う必要がある。最後に、この問題にはコーナーケースが存在する。それが「曲がる噴水の数が長方形の幅と同じケース」である。この場合、必ず1回は噴水を突っ切る必要があるため、その分のロスが生じる。典型の積み重ねという感じが強くて面白い。座圧は実装コストがかなり高いのでライブラリとして持っておくのが吉かもしれない。typo、許されません。解説ABC106の解説。A~Cは穏やか、D難しめ。前編(A-C)久しぶりの解説記事。(Div2)の振り返り。公式はてなブログをはじめよう!misteerさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。