[NOIP2012]疫情控制

你爲何要讀這篇文章(本文涉及的內容):本題(包括加強版)的算法的詳細描述與貪心的正確性證實。算法

解答

2020-03-12 edit:優化

偶然翻到這篇博文,感受本身寫的題解是真的太毒瘤了……連我本身都看不懂本身寫了啥。spa

作了一點修改與補充,enjoy!排序

二分答案+貪心。部署

約定

下文中,咱們:get

  • \(d(u,v)\)表示在樹上\(u\)\(v\)兩點之間的距離,
  • \(tree(u)\)表示\(u\)的子樹內的全部節點的集合,
  • \(son(u)\)表示\(u\)的全部兒子節點的集合,
  • \(leaf(u)\subseteq tree(u)\)表示\(tree(u)\)中的全部葉子節點。

初步

考慮\(leaf(u)\)被控制的充分必要條件:it

  • 存在軍隊\(x\)\(u\)的祖先,或
  • 對於每個\(v\in son(u)\)\(leaf(v)\)都已經被控制。

爲了簡化問題,咱們先考慮在二分到\(mid\)時,哪些軍隊的位置是固定的。io

顯然,對於那些「不能到達根節點」,即\(d(x,1)>mid\)的軍隊\(x\),儘可能向上移動是最優的。class

那麼,能夠用倍增\(O(\log n)\)時間內處理出這些軍隊的最終位置,能夠經過 DFS 求出根的哪些兒子的子樹(的葉節點)沒有被(徹底)控制,設其集合爲\(S_1\subseteq son(1)\)。(顯然,其餘節點都部署在根的兒子上)方法

貪心

以後,就是考慮可以到達根\(1\)的節點如何部署的問題了。因爲離根越遠的兒子越難知足,根據貪心的原則,優先考慮離根最的兒子\(u\)

  1. 若是\(u\)的子樹內有能夠到達\(u\)的軍隊,取距根最的(可部署的)\(x\)部署。
  2. 不然(或者該子樹內全部軍隊均已被部署),取到\(1\)的軍隊\(x\)部署。

一個實現上的優化:若\(u\)的子樹內能夠到達\(u\)且離\(u\)最遠的軍隊已經被部署,則\(u\)的子樹內已經沒有未被部署的軍隊(由於老是由近到遠選擇軍隊部署),直接轉到2便可。

正確性

若某個可行解裏\(x\)部署到了\(v\in S_1,v\ne u\)上(或者沒有部署,此時正確性是顯然的),考慮該解中,部署在\(u\)的軍隊\(x'\),則其能夠與\(x\)交換部署的位置。咱們來證實這一點。

有假設,顯然有\(d(x',u)\le mid,d(x,v)\le mid\)。此外,\(x\)必定能夠部署到\(u\)上,有\(d(x,u)\le mid\)

故咱們只須要說明\(x'\)能夠部署在\(v\)上,即\(d(x',v)\le mid\)便可。咱們來分狀況說明這一點:

如下的證實爲了避免把行內公式寫得太長,跳過了一些步驟。

具體證實最多隻需用到\(d(x,y)\le d(x,z)+d(z,w)\),就做爲留給讀者的練習了~

  1. \(x\)\(u\)子樹內:此時\(d(x,v)=d(x,u)+d(u,v)\)
    1. \(x'\)\(u\)子樹內:
      • 此時\(d(x',v)=d(x',u)+d(u,v)\)
      • 則由\(x\)的距離\(1\)的最遠性,有\(d(x',v)\le d(x,v)\le mid\)
      • \(x'\)能部署在\(v\)上。
    2. 不然,\(x'\)不在\(u\)子樹內:
      • 則由\(u\)距離\(1\)的最遠性,有\(d(u,1)\ge d(v,1)\)
      • 可獲得\(d(x',v)\le d(x',u)\le mid\)
      • \(x'\)能部署在\(v\)上。
  2. \(x\)不是\(u\)子樹內的節點:顯然此時\(x'\)不可能在\(u\)子樹內。
    • 則由1.2的證實方法,可得\(d(x',v)\le d(x',u)\le mid\)

那麼(基本上只須要按照上面的描述)直接寫就能夠了。(注意細節……這題畢竟是個紫題……)

LOJ上的增強版

增強版的數據要求算法複雜度只能一個\(\log\),怎麼辦?

顯然,二分答案這一步是沒辦法去掉的……只能嘗試把判斷可行性優化到\(O(n)\)

注意到在\(mid\)時間內處理出(不)能夠到\(1\)的軍隊是簡單的:預先處理出全部\(d(x,1)\)並排序,則答案爲一個它的一個前綴。

考慮不倍增怎麼求\(1\)的「哪些\(u\in son(v)\)的子樹被控制」。換句話說,對於一個節點\(u\in son(1)\),咱們須要知道:

  1. 它的(全部)子樹是否所有被(徹底)控制。
  2. 有沒有一個軍隊能夠到\(u\)(的祖先),便是否存在\(x\)知足\(d(x,1)>mid,d(x,u)\le mid\)

標記那些\(d(x,1)>mid\)的軍隊\(x\)(在樹上的位置),在 DFS 到\(u\)時顯然能夠全部\(v\in son(u)\)的子樹是否被控制,以及節點\(u\)距離最近的\(x\in tree(u)\)的距離,判斷是否有\(d(x,u)\le mid\)便可。

LOJ最短代碼 (寫文章時)

相關文章
相關標籤/搜索