Ubuntu 21.10 找不到無線WIFI問題排查
本篇隨筆簡單講解一下資訊學奧林匹克競賽中樹上差分的相關知識點。樹上差分近幾年成為了考試熱門,也成為了考察差分思想比較常用的手段。理解樹上差分最好需要讀者瞭解圖和樹的基礎知識,\(LCA\)及\(LCA\)問題的求法,以及差分陣列和差分思想。
一、邊的差分
我們對差分和差分陣列的理解一般都是停留在陣列這種線性結構上的。這可能會導致我們學習樹上差分的時候無法理解這個概念。
樹上差分一般應用於我們在樹上的路徑統計。
對於一棵樹,我們可以設定差分陣列\(cnt[i]\)表示經過邊\(i\)(邊\(i\)的定義是連結\(i\)到\(i\)的父親這一條邊)的次數。
那麼類比於差分陣列,如果要從\(u\)到\(v\)
這是為什麼呢?
首先,介紹樹的兩個性質:
1、任意兩點之間有且只有一條簡單路徑。
2、如果是一棵無根樹,那麼確定根節點後,除根節點外每個點有且只有一個父親節點。
那麼,先來看一張圖:
對於這棵樹來講,如果我們想對一條路徑:\(5−9\)進行差分修改,那麼從\(5−9\)的唯一簡單路徑就是\(5−2−1−4−3−9\),必過它們的最近公共祖先\(1\)。那麼,在這條路徑上 ,除了根節點之外的所有節點,因為只有一個父親,那麼這條路徑既然經過它,則一定經過它的父親。那麼,根據這條性質:我們就可以把\(5−9\)
那我們就可以把它變成一個差分陣列的問題,對於一條鏈來講,我們認為這是一個線性序列,則有:\(cnt[u]++\),\(cnt[lca]−−\),同理,有\(cnt[lca]−−\),\(cnt[v]++\),則推出了前面的性質。
二、點的差分
對於圖上的問題,有一些問題是帶邊權的,有一些問題則是帶點權的。對於這些問題,我們可以把兩種權值互相轉化,即邊權轉點權、點權轉邊權等操作。但是其實有的時候完全沒必要。我們完全可以可以再開發出點的差分。
類比邊的差分,點的差分陣列比較好定義:cnt[i]表示i點一共被經過多少次。那麼對一次路徑修改:u−v,就有cnt[u]++,cnt[v]++,cnt[lca]−−,cnt[fa[lca]]−−。
也就是說,比邊的差分不僅減小了LCA的差分點權,還減小了其LCA父節點的差分點權。
這是為什麼呢?
放原圖: