1. 程式人生 > >關於樹上資訊的維護(持續更新因為後面沒聽懂(逃))

關於樹上資訊的維護(持續更新因為後面沒聽懂(逃))

1.Dfs序的一些奇奇怪怪的操作和改進

所謂dfs序,就是一棵樹被 dfs 時所經過的節點的順序。一般的作用是維護子樹資訊,如果記錄 dfn[i] 表示 i 號點的 dfs 序,sze[i]表示 i 號點的子樹大小,那麼 x 是 y 的祖先等價於:dfn[y] ∈ [dfn[x], dfn[x]+sze[x]−1]

那麼我們就可以利用dfs序來進行一些樹上的操作:

1.維護一棵樹,支援:子樹加,鏈加,單點求值。

        對於子樹加,相當於是 dfs 序列上的區間加。

        對於鏈加,可以看作是一個點到根上的路徑加。

        可以把這次的修改放到這個點上,然後單點查詢的時候在子樹內區間詢問貢獻。

2.維護一棵樹,支援:子樹加,鏈加,子樹求和。

        對於子樹加,相當於是 dfs 序列上的區間加。

        對於鏈加,可以看作是一個點到根上的路徑加。

        一個修改 (x,W) 對 y 有貢獻當且僅當 y 為 x 的祖先。且貢獻為(dep[x]−dep[y]+1)∗W。

        分離變數,即為dep[x]∗W+(1−dep[y])∗W。

        所以維護兩個區間和就行了。

3.維護一棵樹,支援:單點加,鏈求和。

        對於鏈求和,可以看作是一個點到根上的路徑求和。

        一個修改 (x,W) 對 y 有貢獻當且僅當 x 為 y 的祖先。

        相當於支援區間加,單點求值。

4.維護一棵樹,支援:子樹加,鏈求和。

        對於鏈求和,可以看作是一個點到根上的路徑求和。

        一個修改 (x,W) 對 y 有貢獻當且僅當 x 為 y 的祖先,且貢獻為(dep[y]−dep[x]+1)∗W。

        分離變數,即為(dep[y]+1)∗W−dep[x]∗W。

        維護兩個區間和即可。

5.維護一棵樹,支援:子樹加,鏈加,鏈求和。

        子樹加對於鏈求和,可以看作是一個點到根上的路徑求和。

        關於鏈加,(x,W) 對 y 的貢獻分開討論:

        (1)若 x 為 y 的祖先,那麼貢獻為 depx ∗W。

        (2)若 y 為 x 的祖先,那麼貢獻為 depy ∗W

        分開維護貢獻即可。

然後將這些東東結合起來,就可以出一些毒瘤題了(逃)~

2018.10.6  12:00,待補坑