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]の更新は最大でmaxdi\max d_i回しか起こらず、したがってvvの隣接頂点が走査される回数も高々maxdi\max d_i回である。クエリをすべて処理した時、前者の合計はO(Nmaxdi){\mathcal O}(N\max d_i)で後者の合計はO(Mmaxdi){\mathcal O}(M\max d_i)なので、計算量はO(Q+(N+M)maxdi){\mathcal O}(Q+(N+M)\max d_i)である。


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

ABC 132 E - Hopscotch Addictで失敗した記憶が頭にあったせいかも。いちおう整理しておくと、N(x):={(u,v)V2uvx}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(V2){\mathcal O}(|V|^2)である。


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