1. 程式人生 > 其它 >一些依靠遍歷序維護樹上資訊的方法

一些依靠遍歷序維護樹上資訊的方法

主要依據維護區域的形態進行分類。
通過合適的選擇遍歷序,我們常常能將樹上的範圍轉化成序列上的一段區間。

直接表示成常數段區間

子樹、子樹補

最常見的。利用dfs序即可。

去掉某個點的子樹以及其到根路徑的範圍

不知道怎麼命名的區域……
利用後序遍歷和反後序遍歷(即在遍歷兒子時使用相反的優先順序),我們可以用一個字首+一個字尾表示出一個點的上述範圍。

一個點的鄰域

這裡的鄰域就是指和該點直接相鄰的點。
我們把它們分成兒子和父親兩類。父親只有一個,是好處理的。利用bfs序,可以將兒子表示成一段區間。
進一步的,“某個點的子樹內到它的距離恰好為x的點”也可以用bfs序表示。

同時維護子樹和鄰域

使用bdfs序:用dfs遍歷到一個點時,將它的所有兒子加入序列。這種序列具有以下特點:

  1. 一個點的所有兒子構成連續的一段區間。
  2. 一個點的子樹除去這個點自身之外,構成連續的一段區間。

配合樹鏈剖分

下面我們預設使用重鏈剖分。

鏈上操作

我們自然需要使用dfs序來保證

一些小技巧

轉化貢獻

往往應用在操作(修改/查詢)是單點的情況。
比如說鏈加、單點求值,自然可以樹剖+線段樹,但是若是轉化貢獻,可以變成單點加、子樹求和,就是一個BIT可以解決的了。