CF23 E Tree 樹形dp 高精度

2022-02-27 13:42:34 字數 1465 閱讀 1376

cf23 e. tree

cf竟讓卡常qaq

dp+高精度

dp[x][j]表示以x為根的子樹,x所屬的聯通塊大小為j,的最大乘積(不帶j這塊

最後f[x]維護以x為根的子樹的最大答案

有點卡記憶體...高精壓了4位

看了題解,了解到,其實這個dp的複雜度其實是o(n^2)

每次轉移是複雜度是x之前的子樹的sz * 當前子樹的sz

相當於之前子樹所有點和當前子樹的點組成的點對數

而每個點對只會在lca處被計算一次

所以複雜度o(n^2)

#include#include#includeinline int read()  

const int l = 10000;

const int maxn = 701;

const int maxlen = 61;

struct bignum

void print()

} printf("%d",num[i - 1]);

} else printf("%d",num[i - 1]);

puts("");

} } dp[maxn][maxn],max[maxn];

bignum operator * (bignum a,bignum b)

} len = a.len + b.len;

while(ret.num[len-1] == 0 && len > 1) len --;

ret.len = len;

return ret;

} bignum operator / (bignum a,int b)

} while(ret.num[len] > 0) ret.num[len+1] = ret.num[len] / l, ret.num[len ++] %= l;

ret.len = len;

return ret;

} bignum max(bignum a,bignum b)

return b;

} //-------------------------------

struct node edge[maxn << 1];

int head[maxn],num = 0;

inline void add_edge(int u,int v) int n;

int siz[maxn];

void dfs(int x,int fa)

for(int i = head[x];i;i = edge[i].next)

} for(int i = siz[x];i ;-- i) max[x] = max(max[x],dp[x][i] / i);

} int main()

dfs(1,0);

max[1].print();

CF1111E Tree 樹鏈剖分,DP

過年了,洛咕還沒爬這次的題,先放個cf的鏈結吧。補個lg傳送門。對於每個詢問點 x 設它的祖先即不能和它放在同乙個集合中的點的個數為 f x 設 dp i j 表示前 i 個詢問點放在 j 個非空集合中的方案數,注意這裡 前 i 個 的意義,這表示會對第 i 個點造成影響的點都已被考慮過了,轉移就是...

CF123E Maze 期望 樹形dp

題目鏈結 題目鏈結是洛谷翻譯過的。題意 給你一棵樹,邊權都是1,每乙個點有乙個是起點的概率和乙個是終點的概率,你將以起點為根,開始在樹上隨機dfs,直到走到終點。求dfs從起點到終點的期望長度。n 10w 題解 我們考慮一條確定路徑從s到t的期望步數的計算方法。我們發現,這個答案根據期望的線性性,我...

CF697D Puzzles 樹形dp 期望dp

給一棵樹,dfs時隨機等概率選擇走子樹,求期望時間戳。乙個非常簡單的樹形dp?期望dp。推導出來轉移式就非常簡單了。在經過分析以後,我們發現期望時間戳其實只需要考慮自己父親下來 步數加一 從兄弟回來兩種可能。設size i 為i節點子樹大小 包括自身 對於兄弟的情況,i節點的乙個兄弟有1 2的可能已...