題意:
給一棵 n 個點的邊 + 點權樹,求帶權重⼼
思路:其實這題和之前那個 sta 有點像,我們同樣只需要預處理出乙個f[u] 代表以 u 為集合點的方便程度,那麼我們就可以o(1)的轉移了
假設 v 是 u 的兒子,f[v] = f[u] - (siz[v] * len) + (n - siz[v] ) * len = f[u] + (n - 2 * siz[v] ) * len
這題有乙個坑,就是你的inf得開的特別大,不然你就沒有 100 了
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1
const
double eps = 1e-10
;const
int maxn = 1e5 + 10
;const ll mod = 1e9 + 7
;int sgn(double a)
using
namespace
std;
struct
edge e[maxn
<< 1
];int
head[maxn];
ll siz[maxn],dis[maxn],num[maxn],f[maxn];
intcnt,n;
ll ans;
inline
void add_edge(int u,int v,int
w) inline
void dfs(int u,int
f) }
inline
void func(int x,int
fa)
}int
main()
for (int i = 1;i < n;i++)
dfs(
1,0);
for (int i = 1;i <= n;i++)
func(
1,0);
for (int i = 1;i <= n;i++)
cout
<< ans
}
USACO10MAR 偉大的奶牛聚集
因為是英文題,題目不再重複。給你一棵無根樹,每條邊有邊權,每個點有點權,要你選乙個點,使每個點到這個點的距離 點權的和最小,求這個值。設dis u 為u所有後代到它的距離 點權,sum u 為u所有後代的點權和包括u 先以1為根dfs一遍,預處理出所有的dis,sum 然後問題就變成了更換這棵樹的根...
P2943 Usaco2009 Mar 打掃衛生
神題一道 變數異常複雜,請在結合程式及注釋的情況下 根據題意不難看出,在選擇的一段區間內,最多有 n sqrt n 種不同的食物。據此設計dp陣列f i 表示i時的最小代價。設計輔助陣列pos j 表示最多選j種食物時區間左端點位置。思考 遍歷到i時,使區間食物種數不變應滿足什麼條件?得出 若上乙個...
P2983 USACO10FEB 購買巧克力
題解 注意題目開 long long 貪心策略 從低到高,買夠為止 反證 若剩下的有乙個k 比k小,那麼交換,穩賺不賠 所以,在買k之前,所有比他便宜的都買完了 include include include include include include include include using...