簡單樹上操作
我發現乙個星期不訓練,水平下降很多,這道一眼換根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,求出當前樹形結構下以每個點為根的子...