題目傳送門
先考慮換根操作,珂以直接對一個節點 $ x $ 分類討論,因為這題只需要知道子樹,那麼只看子樹的變動就好了。
- 若根在初始關係中的 $ x $ 節點的上端,則 $ x $ 的子樹沒變換。
- 若根是 $ x $,則 $ x $ 就是根。合理。
- 若根是 $ x $ 中初始關係的子節點的子樹,則 $ x $ 的子樹就是整棵樹出那顆子節點的所有子樹外。
然後就是查詢操作,顯然弄成區間。即
拆成 $ 4 \times 4 $ 個查詢。然後莫隊搞。大致思路就是 $ (a + 1) \times b = a \times b + b $ 和 $ (a - 1) \times b = a \times b - b $。但是過不了。
設 $ f(l_1, r_1, l_2, r_2) $ 表示 $ dfs $ 序上區間 $ [l_1, r_1] $ 和區間 $ [l_2, r_2] $ 任選兩個點,使得權值相同的方案數。珂以先預處理出 $ f(1, i, 1, n)( 1\le i \le n) $ 這 $ n $ 個值,方便後邊。
然後珂以對兩個節點的所有可能都討論一遍。
-
$ root $ 在 $ x, y $ 的初始關係的上面。那麼就將一個區間拆成四個區間。
-
$ root $ 在 $ x $ 的初始關係的上面,並且 $ y $ 是根。這時用剛才預處理的透過字首和拆成兩個已經預處理過的區間。
-
$ root $ 在 $ x $ 的初始關係的上面,並且 $ y $ 的其中一個子節點 $ v $ 的子樹是根。
設 $ x $ 子樹初始的 $ dfs $ 序為 $ [l_1, r_1] \(,\) y $ 子樹初始的 $ dfs $ 序為 $ [l_2, r_2] \(,\) v $ 子樹初始的 $ dfs $ 序為 $ [l_3, r_3] $
則方案數為 $ f(l_1, r_1, 1, l_3 - 1) + f(l_1, r_1, r_3 + 1, n) = f(1, r_1, 1, l_3 - 1) - f(1, l_1 - 1, 1, l_3 - 1) + f(1, r_1, 1, n) - f(1, r_1, 1, r_3) - f(1, l_1 - 1, 1, n) + f(1, l_1 - 1, 1, r_3) $
透過預處理就只剩下 $ 4 $ 個區間。
-
$ x $ 是根,並且 $ root $ 在 $ y $ 的初始關係的上面。交換 $ x, y $,變成 2.。
-
$ x $ 是根,並且 $ y $ 也是根。就是預處理的 $ f(1, n, 1, n) $
-
$ x $ 是根,並且 $ root $ 在 $ y $ 的其中一個子節點 $ v $ 的子樹是根。那麼就是剛才預處理的 $ f(1, n, 1, l_3 - 1) + f(1, n, r_3 + 1, n) = f(1, l_3 - 1, 1, n) + f(1, n, 1, n) - f(1, n, 1, r_3) $。全都是預處理出的。
-
$ x $ 的一個子節點 $ u $ 的一個子樹是根,並且 $ root $ 在 $ y $ 的初始關係的上面。交換 $ x, y $,變成3.。
-
$ x $ 的一個子節點 $ u $ 的一個子樹是根,$ y $ 是根。交換 $ x, y $ 變成6.。
-
$ x $ 的一個子節點 $ u $ 的一個子樹是根,$ y $ 的一個子節點 $ v $ 的一個子樹也是根。
設 $ x $ 子樹初始的 $ dfs $ 序為 $ [l_1, r_1] \(,\) y $ 子樹初始的 $ dfs $ 序為 $ [l_2, r_2] \(,\) u $ 子樹初始的 $ dfs $ 序為 $ [l_3, r_3] \(,\) v $ 子樹初始的 $ dfs $ 序為 $ [l_4, r_4] $
$ f(1, l_3 - 1, 1, l_4 - 1) + f(1, l_3 - 1, r_4 + 1, n) + f(r_3 + 1, n, 1, l_4 - 1) + f(r_3 + 1, n, r_4 + 1, n) = f(1, l_3 - 1, 1, l_4 - 1) + f(1, l_3 - 1, 1, n) - f(1, l_3 - 1, 1, r_4) + f(1, l_4 - 1, 1, n) - f(1, l_4 - 1, 1, r_3) + f(1, n, r_4 + 1, n) - f(1, r_3, r_4 + 1, n) $
$ =f(1, l_3 - 1, 1, l_4 - 1) + f(1, l_3 - 1, 1, n) - f(1, l_3 - 1, 1, r_4) + f(1, l_4 - 1, 1, n) - f(1, l_4 - 1, 1, r_3) + f(1, n, 1, n) - f(1, n, 1, r_4) - f(1, r_3, 1, n) + f(1, r_3, 1, r_4) $
把預處理的去掉,就只剩下了 $ 4 $ 個區間。
然後問題就變成了怎麼求 $ u, v $。已經知道了 $ u, v $ 和 $ root $ 的距離的話,就珂以樹上 $ K $ 級祖先直接求了。