簡單樹上操作 換根dp

2021-10-01 04:28:50 字數 1131 閱讀 2853

簡單樹上操作

我發現乙個星期不訓練,水平下降很多,這道一眼換根dp沒看出來,

還是太菜了,補題。

題意:求多少對(x,y)之間的距離等於樹直徑。

題解:樹形dp維護,節點u到達的最遠距離和到達最遠距離的點的數量。然後換根dp列舉每個點。

#include

#define ll long long

#define pi pair

#define mk make_pair

using

namespace std;

const

int maxn =

3e5+10;

vector<

int>g[maxn]

;vectorsf[maxn]

;ll dp[maxn]

,ans,mx;

int dep[maxn]

;void

dfs(

int u,

int fa)

}void

dfs2

(int u,

int fa)

if(dep[u]

>mx)

else

if(mx==dep[u]

) ans +

= dp[u]

; pi tmp =mk(

0,0)

;for

(int i=g[u]

.size()

-1;i>=

0;i--

)else

if(tmp.first>sf[u]

[i].first)

else

if(dep[v]+1

>tmp.first)

else

if(dep[v]+1

==tmp.first) tmp.second +

= dp[v];if

(v!=fa)

dfs2

(v,u);}

}int

main()

dfs(1,

0);dfs2(1

,0);

printf

("%lld\n"

,ans)

;}

樹上操作 相遇

傳送門 神仙部落格!大概題意就是給定m條路徑,求第i條和前面i 1條中的多少個相交。當路徑a與其他路徑相交,分兩種情況 其他路徑的lca在a上,或者a的lca在其他路徑上。以下先不考慮兩條路徑的lca重合的情況 以下子樹可以轉化為dfs序的乙個區間 第一種情況 在路徑兩個端點上打乙個 1的標記,在l...

樹形 dp 換根 dp

樹形dp 樹形動歸一般是依賴於dfs的,根據動歸的後效性,父節點的狀態一般都依賴子節點的狀態以某種方式轉移而來 換根的p2015 設f i j 表示i的子樹上保留j條邊最多蘋果數 p2279 狀態表示f x 0 覆蓋到x的爺爺和x整棵子樹 向上2層 最少個數 f x 1 覆蓋到x的父親和x子樹 向上...

樹形DP 換根DP

某些樹形dp問題中,我們要求的值是類似 以當前節點為根節點得到的答案 卻沒有給出固定的根節點,若仍然按照常規的樹形dp思路對每個點進行dp,我們對每乙個節點均進行一次 dfs 最後的複雜度是 o left n 2 right 如果我們先假設任意乙個點為根進行 dp,求出當前樹形結構下以每個點為根的子...