問題はこちら
問題概要
頂点の木が与えられる. 木の各辺には色が塗られていて長さはである. このとき, 以下の個の問いに答えよ.
色が塗られている辺の長さがに変更されたと仮定したときの二頂点間の距離を求めよ. (辺の長さの変更はこれ以降の問いには影響しない)
思考の流れ
これっぽさがある. kanpurin.hatenablog.com
木上の二頂点間の距離は適当な頂点を根としてLCAを求めることで, 各頂点から根までの距離を求めておくことですぐ求めることができる. しかし今回は辺の長さの変更があるので面倒.
すべての色と頂点に関して根からまでに通る色に塗られた辺の数とその長さの合計がわかれば, 色が塗られている辺の長さをに変更したときの根から頂点までの距離はとなる.
よって質問に対する答えはとなる.
各色各頂点に対して求めようとするとかかり間に合わない.
そこで, DFSをする際に根から現在の頂点までの色の辺の数とその長さの合計を保存する配列を(グローバルかなんかに)持つ. DFSで潜る際に辺の色と長さを配列に追加(足す)していってDFSで戻る際にその値を削除(引く)してやれば常に根から現在みている頂点までの必要な値が求まっていて, 更新も回で済んでいる.
質問を先読みして, どの頂点のどの色が必要なのかを見ておくことですべての値を保存しておく必要がなく高速に答えることができる.
提出プログラム
https://atcoder.jp/contests/abc133/submissions/12217539
感想
できなかった(解説ACした). DFSの良さを用いて, 戻るときに自分のいた痕跡を消すみたいな動作をして根からのパス上のもののみを考えるのはかなり使えると感じた.