這是我自己的發明

lopgov發表於2024-11-20

題目傳送門

先考慮換根操作,珂以直接對一個節點 $ x $ 分類討論,因為這題只需要知道子樹,那麼只看子樹的變動就好了。

  • 若根在初始關係中的 $ x $ 節點的上端,則 $ x $ 的子樹沒變換。
  • 若根是 $ x $,則 $ x $ 就是根。合理。
  • 若根是 $ x $ 中初始關係的子節點的子樹,則 $ x $ 的子樹就是整棵樹出那顆子節點的所有子樹外。

然後就是查詢操作,顯然弄成區間。即

\[\sum_{i\in value} cnt_{l_1, r_1, i} \times cnt_{l_2, r_2, i} = \sum_{i\in value} cnt_{1, r_1, i} \times cnt_{1, r_2, i} - \sum_{i\in value} cnt_{1, l_1 - 1, i} \times cnt_{1, r_2, i} - \sum_{i\in value} cnt_{1, r_1, i} \times cnt_{1, l_2 - 1, i} + \sum_{i\in value} cnt_{1, l_1 - 1, i} \times cnt_{1, l_2 - 1, i} \\ =\sum_{i\in value} cnt_{1, r_1, i} \times cnt_{1, r2, i} \\ -\sum_{i\in value} cnt_{1, l_1 - 1, i} \times cnt_{1, r2, i} \\ -\sum_{i\in value} cnt_{1, l_2 - 1, i} \times cnt_{1, r1, i} \\ +\sum_{i\in value} cnt_{1, l_1 - 1, i} \times cnt_{1, l2 - 1, i} \\ \]

拆成 $ 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 $ 個值,方便後邊。

然後珂以對兩個節點的所有可能都討論一遍。

  1. $ root $ 在 $ x, y $ 的初始關係的上面。那麼就將一個區間拆成四個區間。

  2. $ root $ 在 $ x $ 的初始關係的上面,並且 $ y $ 是根。這時用剛才預處理的透過字首和拆成兩個已經預處理過的區間。

  3. $ 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 $ 個區間。

  4. $ x $ 是根,並且 $ root $ 在 $ y $ 的初始關係的上面。交換 $ x, y $,變成 2.。

  5. $ x $ 是根,並且 $ y $ 也是根。就是預處理的 $ f(1, n, 1, n) $

  6. $ 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) $。全都是預處理出的。

  7. $ x $ 的一個子節點 $ u $ 的一個子樹是根,並且 $ root $ 在 $ y $ 的初始關係的上面。交換 $ x, y $,變成3.。

  8. $ x $ 的一個子節點 $ u $ 的一個子樹是根,$ y $ 是根。交換 $ x, y $ 變成6.。

  9. $ 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 $ 級祖先直接求了。

相關文章