1. 程式人生 > >【總結】靜態點分治

【總結】靜態點分治

.net 思考 當前 模板 detail 速度 方便 直接 每一個

這是一篇關於靜態點分治的總結

點分治是什麽?

就是一種統計答案的方式,用在樹上
想要從頭開始學點分治的話,可以點這裏
點分治的標誌:樹上處理點對問題大部分用點分(當然還要復雜度允許)
對於一個樹上點對問題,一個點只會有兩種情況,一種是選,一種是不選
那麽點分治就是按照這種思路去完成答案的統計,然後每次都找的是重心(size最大的子樹的size最小的點),保證復雜度

一些可能有用的東西

點分治並不模板,而且還很思維。分治好後,統計答案還是需要思考的,而不是萬能板子,所以沒有捷徑
這裏只是一些去重的方法

  • 如果要統計的東西是一個整體的答案,而不針對於樹上的每一個點,並且方便去重(感性理解),那麽對於去重就直接在solve中枚舉每一個子樹去重就行了
  • 統計的如果是整體,但不方便去重,那麽每個遞歸的solve,都是一遍維護,一遍算答案,維護的是當前枚舉的子樹之前的(或左邊的)子樹的貢獻,然後對於當前子樹算它與之前的子樹的答案,這樣就可以避免去重了,因為加的貢獻一定不是同一個子樹的
  • 如果答案需要針對每一個點,那麽就一次遞歸中,就先把所有的子樹答案先統計好,然後對於每一個子樹,先把它的貢獻從統計裏減去,然後再算這個子樹得到答案,然後再把這個子樹的貢獻加回去

一些題目

題目很少,做得不多

  • 【刷題】洛谷 P3806【模板】點分治1(模板)
  • 【刷題】BZOJ 2152 聰聰可可(一點思維)
  • 【刷題】BZOJ 2599 [IOI2011]Race(邊維護邊算答案)
  • 【刷題】洛谷 P2664 樹上遊戲(比較繁瑣地針對每一個點統計答案)

就只有4道了

從未結束

靜態點分治弄完了 ????
接下來做題速度會慢下來,但每道題一定要滿收獲!!!!

【總結】靜態點分治