閱讀體驗:https://www.zybuluo.com/Junlier/note/1228014
樹上差分
數學方法——差分
啦啦啦~樹上差分一點都不難(難的是天天愛跑步)
前置知識點
-
首先得知道差分這個東西吧! 簡單差分
-
在講樹上差分之前,首先需要知道樹的以下兩個性質:
- 任意兩個節點之間有且只有一條路徑。
- 一個節點只有一個父親節點(即只有一條返祖邊)
-
可以發現所有樹上兩點(p,q)的路徑可拆為:p--->lca(p,q)--->q
樹上差分
最近考樹上差分考得還挺多的
所以想要阿克的巨佬們最好學一下
像差分一樣,樹上差分也有前綴和思想
一個點的真實權值是一個點子樹內所有差分后的權值之和(額,有點拗口沒關系)
總的來說就是一個點的差分數組最后的值是整個子樹內差分數組的和,再加進點的權值里
所以怎么差分呢
先拋出一個問題:給你m個操作,問你每次在(p,q)路徑上給所有點的權值+1,問你最后點的權值情況(時間復雜度:請你盡量跑得快)
我們考慮差分,時刻記住上面的那句加粗的話
首先在p上面對差分數組+1,再在q上面對差分數組+1,在Lca(p,q)處對差分數組-1
我們根據上面所說的方法統計一遍子樹差分數組和,就會發現正如所想
那么我們就可以推廣到所有的情況了是吧
顯然這樣差分的修改復雜度是(O(logn))的(求Lca),只要最后再一邊掃就是吧
你甚至可以Tarjan用求來優化掉每次修改的時候查的那個logn
如果需要代碼板子的話可以看下面例題。。。
總結一下:
- 樹上差分主要用於求解一些樹上的路徑問題
- 它通過利用樹的一些性質,用一個差分數組來實現對一條路徑的操作,這涉及到路徑的 起,終點 與lca。
- 一般情況下:一個點的真實權值為其所在子樹內所有點的差分數組的值的和
- 樹上差分一般不適用於詢問和操作嵌套的題目,這時一般用樹鏈剖分解決
幾道題:
luoguP3128 [USACO15DEC]最大流Max Flow 題解 板子題
luoguP3258 [JLOI2014]松鼠的新家 題解 板子題
luoguP2680 運輸計划題解 題解 有難度
可以挑戰一下天天愛跑步。。。