2019年7月15日月曜日

AGC 012 B - Splatter Painting

AGC 012 B - Splatter Painting

クエリを逆順に処理し、頂点の色が最初に塗った色に固定される問題に変える。頂点vvから処理した最大の深さをdepth⁡[v]\operatorname{depth}[v]、頂点vvに塗った色をcolor[v]⁡\operatorname{color[v]}(どちらも初期値00)として、クエリ毎にDFSで更新していく。depth⁡[v]\operatorname{depth}[v]以下の深さの更新は影響しないので、枝刈りしてよい。

各頂点vvについてdepth⁡[v]\operatorname{depth}[v]の更新は最大でmax⁡di\max d_i回しか起こらず、したがってvvの隣接頂点が走査される回数も高々max⁡di\max d_i回である。クエリをすべて処理した時、前者の合計はO(Nmax⁡di){\mathcal O}(N\max d_i)で後者の合計はO(Mmax⁡di){\mathcal O}(M\max d_i)なので、計算量はO(Q+(N+M)max⁡di){\mathcal O}(Q+(N+M)\max d_i)である。


隣接頂点が走査される回数がなぜかO(∣V∣2){\mathcal O}(|V|^2)な気がして困っていた。

ABC 132 E - Hopscotch Addictで失敗した記憶が頭にあったせいかも。いちおう整理しておくと、N(x):={(u,v)∈V2 ∣ uとvの最短距離がx}N(x):=\{(u, v) \in V^2 \:|\: uとvの最短距離がx\}とするとき、当然∣N(1)∣=O(∣E∣)|N(1)| = {\mathcal O}(|E|)であるが、N(2),N(3),...N(2), N(3), ...の大きさはO(∣E∣){\mathcal O}(|E|)とは限らず1、一般にO(∣V∣2){\mathcal O}(|V|^2)である。


  1. 例えばスターグラフは∣E∣=Θ(∣V∣)|E|= \Theta(|V|)だがN(2)=Θ(∣V∣2)N(2) = \Theta(|V|^2)になる。 ↩︎