1. 程式人生 > 其它 >AGC008 部分簡要題解

AGC008 部分簡要題解

感覺 F 很厲害啊,但也比較套路。

F

不妨前考慮 \(70 \%\) 的部分分,\(s\) 全部為 \(1\)

首先可以發現這個問題之所以困難是因為同一個聯通子樹可能可以被多箇中心節點匯出。

因此,我們考慮對於一個合法的聯通子樹,在 一個 特殊的節點上將其統計,這樣可以不重不漏的計算。

為了方便我們令 \(f(x, d)\) 為以 \(x\) 為染色中心距離其不超過 \(d\) 的點構成點集。

考慮什麼時候兩個點會重複統計,不難得到如下觀察:

  • \(f(x, d) \ne \{1, 2, \cdots n\}\) 則對於任意不同的 \(d\)\(f\) 所對點集不同。

證明很顯然。

因此,以下我們僅考慮不為全集的聯通子樹,顯然全集是一定合法的。

  • \(f(x, d_1) = f(y, d_2)\) 那麼一定有靠 \(x\) 一邊的子樹全部被染黑或靠 \(y\) 一邊的子樹全部被染黑。

若兩邊不存在一個子樹全部被染黑,令 \(k = dist(x, y) > 0\) 則有:\(d_1 = d_2 + k, d_2 = d_1 + k\),矛盾。

  • \(f(x, d_1) = f(y, d_2)\) 那麼 \(x, y\) 構成的鏈上一定存在且恰好存在一個點使得其掛在鏈上的子樹記憶體在點沒有被染黑。

反證法,我們可以找到最靠近 \(x\) 子樹內沒有被全部染黑的點 \(u\) 和最靠近 \(y\) 子樹內沒有被全部染黑的點 \(v\)


\(k_1 = dist(x, u), k_2 = dist(y, v)\),則 \(u\) 子樹內一定恰好是深度不超過 \(d_1 - k_1\) 的節點被染黑,\(v\) 子樹內類似為 \(d_2 - k_2\) 的節點被染黑。
同時據此我們也可推出 \(u\) 子樹內一定是被不超過 \(d_2 - k_2 - dist(u, v)\) 的節點被染黑,因為 \(u\) 子樹內沒有被全部染黑,所以深度不超過 \(d_1 - k_1\) 的點構成集合和深度不超過 \(d_2 - k_2 - dist(u, v)(dist(u, v) > 0)\) 構成集合一定不同,矛盾。
唯一性:若不存在則所有點被染黑,與一開始的假設不符。

  • 推論:若 \(x, y\) 在樹上相鄰,那麼一定恰好存在一個點子樹內全部被染黑,一個沒有全部被染黑。

  • \(f(x, d_1) = f(y, d_2)\),則 \(x, y\) 路徑上的每個點 \(u\) 都唯一存在一個 \(d'\) 使得 \(f(x, d_1) = f(u, d') = f(y, d_2)\)

若存在,唯一性由觀察一可以保證。
對於存在性,根據觀察二,我們不妨令 \(x\) 這邊的子樹全部被染黑,根據 \(y\) 這邊的子樹是否被染黑進行討論。

\(y\) 這邊的子樹沒有被全部染黑,則 \(x, y\) 路徑上所有點(除了 \(y\))子樹內全被染黑,則考慮鏈上距離 \(x\) 最近的點 \(u\)
\(k = dist(x, y)\),有 \(f(u, d_2 + k - 1)\) 一定覆蓋 \(f(y, d_2)\) 中除了 \(x\) 所在的子樹內的點。
於此同時,\(f(u, d_2 + k - 1)\) 一定覆蓋了 \(x\) 子樹內距離其不超過 \(d_2 + k - 2\) 的點。
我們知道 \(f(y, d_2)\) 中僅包含距離 \(x \ \ d_2 - k\) 的點,當 \(k \ge 1\) 時恆有 \(k - 2 \ge -k\)

\(y\) 這邊的子樹全部被染黑,令 \(u\)\(x, y\) 路徑上存在的唯一一個沒有被全部染黑的節點。
則有 \(d_1 - dist(x, u) = d_2 - dist(y, u)\),考慮證 \(f(x, d_1) = f(u, d_1 - dist(x, u)) = f(y, d_2)\)
同時有 \(\forall v \in u \to y, maxdep(v) \le d_1 - dist(x, v) = d_1 - dist(x, u) - dist(u, v)\),因此 \(f(u, d_1 - dist(x, u))\) 能覆蓋 \(\forall v \in u \to y\)
同理可證另一邊,此時有 \((x, u), (u, y)\) 為第一種情況,即可證明所有情況。

  • 推論 \(1\)\(\forall S\) 滿足 \(S\) 合法,那麼合法的染色中心一定構成一顆聯通子樹。
  • 推論 \(2\)\(\forall S\) 滿足 \(S\) 合法,\(S\) 合法的染色中心形成的聯通子樹 \(T\) 一定滿足 \((u, v) \in T\)\(f(u, d) = S\)\(u\) 一側子樹內沒有被全部染黑,\(v\) 一側子樹被全部染黑,則一定有 \(f(u, d) = f(v, d + 1)\)(根據觀察四的證明易證)。
  • 推論 \(3\)\(\forall S\) 滿足 \(S\) 合法,\(S\) 合法的染色中心形成的聯通子樹 \(T\) 一定滿足存在且唯一存在 \(u \in T\) 使得 \(f(u, d) = S\) 且以 \(u\) 為根,\(\forall v \in T, f(u, d) = f(v, d + dist(u, d))\)(根據推論 \(2\) 易證)

因此,我們考慮在 \(S\) 的染色中心形成的聯通子樹 \(T\)\(u \in T\)\(f(u, d) = S\) 最小的 \(d\) 上統計 \(S\)

因此,\(u\) 向外擴充套件半徑為 \(d\) 的聯通子樹能統計當且僅當:

  • \(d < f_u\) 其中 \(f_u\) 為距離 \(u\) 最遠點的距離。
  • 根據推論 \(2\)\(u\) 不存在一個子樹使得刪除這個子樹後其他點全被染黑,即 \(d - 2 < g_u\)\(g_u\)\(u\) 往外和 \(f_u\) 所在點不在同一個子樹的最遠點 \(v\) 的距離)。

因此我們考慮換根求出 \(f, g\),即可 \(\mathcal{O}(n)\) 計算答案。

考慮回到 \(s\) 中存在 \(0\) 的情況,我們還是考慮將所有合法的聯通子樹 \(S\) 在將所有點均看作合法情況下應該統計的點統計。

容易發現現在合法的 \(S\) 是部分分的子集,因此只需要將每個點的貢獻考慮進關鍵點的影響即可。

因此 \(\forall u, d \in [0, \min(g_u + 1, f_u - 1)]\) 的每個 \(d\),合法當且僅當 \(f(u, d)\) 的染色中心聯通子樹內至少存在一個合法點。

\(u\) 為關鍵點,顯然所有的 \(d\) 均合法。

否則,考慮將整棵樹以 \(u\) 為根,根據推論二當且僅當存在一個子樹內的點全部被染黑且存在關鍵點。

於是我們令 \(h_u = \min\limits_{u \to v,\exists x \in S_v, s_x = 1} q_v\)(其中 \(q_v\) 為以 \(u\) 為根時 \(v\) 子樹內的最遠點距離),於是相當於對 \(u\) 的貢獻限制了下界:\([h_u, \min(g_u + 1, f_u - 1)]\),同樣換根 \(\rm dp\)\(h, q\) 後直接計算即可。

複雜度 \(\mathcal{O}(n)\)


另外提一嘴,這個題存在另外一個思考方向。

我們不考慮選取關鍵點來統計,考慮將重複計算的聯通子樹減掉。

根據合法的染色中心構成聯通子樹這一性質,我們考慮使用 \(\forall\) 聯通子樹 \(V\) 滿足 \(|V| - |E| = 1\) 來容斥。

具體地,我們考慮將所有點不包含全集的貢獻先全部加上。

然後列舉每條邊 \((u, v)\),考慮計算出 \(u, v\) 構成相同的聯通子樹剪掉,這裡其實就與上面做法的上下界等價。

因此這題存在一個不同的思考方式但匯出的結果一模一樣。

GO!