AGC 012 B - Splatter Painting
クエリを逆順に処理し、頂点の色が最初に塗った色に固定される問題に変える。頂点vから処理した最大の深さをdepth[v]、頂点vに塗った色をcolor[v](どちらも初期値0)として、クエリ毎にDFSで更新していく。depth[v]以下の深さの更新は影響しないので、枝刈りしてよい。
各頂点vについてdepth[v]の更新は最大でmaxdi回しか起こらず、したがってvの隣接頂点が走査される回数も高々maxdi回である。クエリをすべて処理した時、前者の合計はO(Nmaxdi)で後者の合計はO(Mmaxdi)なので、計算量はO(Q+(N+M)maxdi)である。
隣接頂点が走査される回数がなぜかO(∣V∣2)な気がして困っていた。
ABC 132 E - Hopscotch Addictで失敗した記憶が頭にあったせいかも。いちおう整理しておくと、N(x):={(u,v)∈V2∣uとvの最短距離がx}とするとき、当然∣N(1)∣=O(∣E∣)であるが、N(2),N(3),...の大きさはO(∣E∣)とは限らず、一般にO(∣V∣2)である。