0717 樹形dp 容斥原理 BZOJ1827

2021-08-21 12:25:37 字數 926 閱讀 7330

由於是許可權題,我就不好把題目發上來了(萬一bzoj打我怎麼辦),題目大意如下即可

題解:30%資料,暴力計算 

列舉每個點作為集合點,然後計算。兩點距離可以用 lca 來計算 

對於100%資料 

考慮  樹形dp+容斥原理+換根 

定義f[i]表示i為關鍵點答案 

dis[i]表示以i為根子樹和,第一遍樹形dp統計 

num[i]表示點權和,tot為總點權和 

容斥原理: f[v]=f[now]+(tot-num[v])*e[i].w-num[v]*e[i].w;  第二遍樹形dp統計 

由父親節點轉移到兒子節點  容斥比較難想一些,建議畫圖比照**理解 

一定明確要求σ點權*邊權最小,容斥的時候注意計算的是那個點的點權*哪條邊的邊權 

#includeusing namespace std; 

#define n 100010

#define ll long long

struct edgee[n<<1];

ll n,tot=0,ans=0,sum=0;

ll c[n],num[n];

ll fa[n],head[n]=;

ll dis[n]=,dp[n];

void add(ll u,ll v,ll w) //前向星-->鄰接表

void dfs(ll u,ll f)

} void dfs2(ll u)

} int main()

for(ll i=1;idfs(1,0);

for(ll i=1;i<=n;i++)

dp[1]+=dis[i]*c[i];

ans=dp[1];

dfs2(1);

cout

}

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...

容斥原理,反演

大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...

關於容斥原理

容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...