無向辺を2つの有向辺と見て、スコアが下がる向きに重み、上がる向きに、変わらないならを付与すると、ある有向パスが上りになっているクエリがである、下りになっているクエリがである、と判定できる。
ダブリングLCAの構築をする時に、同時にmin/maxについてもダブリングのテーブルを作っておけばパスがbeautifulかどうかは適当に判定できる:
- から根に向けてスコアが上がる限りダブリングで上る。の深さより上(inclusive)に行けたら3に行く。
- さらに根に向けてスコアが下がる限り上る。の深さより上に行けなかったらfalseを返す。の深さより上に行けたら頂上がの側にあると記録しておく。
- から根に向けてスコアが上がる限り上る。の深さより上に行けたらtrueを返す。頂上がの側にあるのにの深さより上に行けなかったらfalse。
- さらに根に向けてスコアが下がる限り上る。の深さより上に行けたらtrueを返す。
- falseを返す。
山のイメージに従って書くだけなので特に難しいとは感じなかった。でも、振り返ってみると、とを完全に対称に扱ったほうがいい気がする。