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的可能已...