競技プログラミング用 知識集積所

ABC429F - Shortest Path Query

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略

考え方

高さが3マスしかないということは、左に移動するのが最短経路になることはない。
つまり、上下右の3つの移動だけで考えればよく、しかも右へ行く回数は絶対にn-1回である。
よって、上下移動の最少回数だけ考えればよい。

各マスの左右辺に、そこを横切るかどうかのチェッカーを置くことを考える。
すると、i列目をある段で抜けてからj列目のある段をある段で抜けるまでの最小上下動回数は、各列での縦移動回数を表現した行列のトロピカル半環※を用いた積で9通り全てを表現することが可能である。

この積の中身は更新されるので、segment木※に行列を載せてやればよい。
答えるべき値は、可能なら全体の積の(0,2)成分の値にn-1を足した値、不可能なら-1となる。

解答例

解答例
TLEが不安な場合、以下で定数倍程度高速化可能。
  • vectorでなくarray※を使う
  • segment木※に入れる8通りのデータを事前に作っておき、コピーだけで済むようにする
  • Sを転置しておく
  • endlではなく"\n"を使う

注意点


別解

ウィキ募集バナー