E - Wheel Distance 解説
by
Nyaan
印刷ページ
頂点 \(N+1\) のことを中心と呼びます。また、いくつかの文字を定義します。
\(A\) の累積和 \(P_0, P_1, \dots, P_N\) を以下のように定義します。
\[P_0 = 0, P_1 = \sum_{j=1}^i A_i\]
\(P_0, P_1, \dots, P_N\) は \(\mathrm{O}(N)\) で計算できます。
また、\(1 \leq v \leq N\) について \(D_v\) を中心から頂点 \(v\) への最短距離として定義します。
\(D_1, D_2, \dots, D_N\) はダイクストラ法で \(\mathrm{O}(N \log N)\) で高速に計算できます。(工夫すると \(\mathrm{O}(N)\) で計算することもできます。興味がある方は考えてみてください。)
これらの情報を利用するとクエリに高速に解答することが出来ます。具体的には、\(S, T\) がクエリで与えられた時、
\[x = \vert P_{S-1} - P_{T-1} \vert\]
と置いて、答えは
\[\min(x, P_N - x, D_S + D_T)\]
となります。
(証明) \(ST\) 経路のうち中心を通る経路と中心を通らない経路で場合分けして考えます。
中心を通る経路は「頂点 \(S\) から中心まで最短距離で行き、さらに中心から頂点 \(T\) まで最短距離で行く」ことが最適で、この時の合計距離は \(D_S + D_T\) です。
中心を通らない経路は円周上を時計回りまたは反時計回りに回る経路が最適で、これらの距離は一方が \(x\) 、もう一方が \(P_N - x\) に対応します。
よってこの 3 個の距離の最小が答えとなります。(証明終わり)
以上の内容を実装すれば答えを \(\mathrm{O}(N \log N)\) で求められて十分高速です。
投稿日時:
最終更新:
