bzoj 3573 Hnoi2014 公尺特運輸

2021-08-29 22:30:54 字數 1076 閱讀 3196

題目好難懂。。

簡述題意:給出一棵樹,要求滿足兩個要求:

1.每個節點的子節點權值相等。

2.每個節點的權值和是這個節點的權值。

然後就出最小修改點的數量來滿足這個要求。

那麼顯而易見只要確定乙個節點就可以確定群圖節點權值。這樣列舉是

通過這個結論我們發現只要確定1就可以確定全圖,所以可以通過讓每乙個節點權值不動,然後判斷有多少個1最後的值相同,

就是最多有多少個不用動的,因為1選這個值可以同理出這些點不動。用總和減去這個值就是答案。

所以我們可以優化一下,dfs遍歷這棵樹,每到乙個節點的時候就乘上這個點子節點的個數,代表如果這個點被作為不動的值

因為這個節點是子節點的和,所以到這個點不動,就是這層都是這個值,就是它父節點的子節點個數的值,向上推同理。

所以可以從根推下來,到每乙個位置只要乘上自己的權值就是這個點不動的時候1的權值。

然後因為值太大了,可以通過兩種方式優化,一種是取log,把乘法變成加法。

另一種是找乙個模數,把大數拆成這個模數的倍數加餘數。

#include#include#include#includeusing namespace std;

int n;

struct node

edge[1000005];

double cmp(double x,double y)

int head[500005],cnt=1,son[500005],val[500005],ans=1,tot;

double f[500005];

void init()

void add(int from,int to)

void dfs(int u,int fa,double v)

}int main()

for(int i=2;i<=n;i++)son[i]--;

dfs(1,1,(double)log(1.0));

sort(f+1,f+1+n,cmp);

for(int i=1;i

printf("%d",n-tot);

return 0;

}

BZOJ 3573 Hnoi2014 公尺特運輸

bzoj 3573 hnoi2014 公尺特運輸 樹形dp hash 題意 給你一棵樹每個點有乙個權值,要求修改最少的權值,使得每個節點的權值等於其兒子的權值和且兒子的權值都相等。分析 首先我們發現在樹中如果確定乙個點的權值,那麼整顆樹的方案就能夠確定 問題轉化成求哪個方案包含的點最多 如何求包含這...

BZOJ3573 Hnoi2014 公尺特運輸

作者部落格 正解 排序 分析 解題報告 題目給出的各項約束條件,其實就是想告訴我們乙個這樣的模型 每個點的權值 父親節點的權值 父親節點的兒子節點個數,修改盡量少的點權使得滿足要求。然後可以發現,只要確定了乙個點填什麼,整棵樹的點權其實就唯一確定了 考慮兩個點 u v 令 dis x x走到根需要乘...

bzoj3573 Hnoi2014 公尺特運輸

好吧,雖然這是day1最後一題,但卻是最水的一題。前提 看懂題目 仔細看題!仔細看題!仔細看題!看懂題後就知道設第 i 個點的兒子節點的個數為 degree i 容量為 a i 我們要修改最少的點的容量,使得每個點 i 的兒子的容量均為 frac 我們發現如果乙個點的容量是確定的,那麼整個樹的容量都...