題目好難懂。。
簡述題意:給出一棵樹,要求滿足兩個要求:
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 我們發現如果乙個點的容量是確定的,那麼整個樹的容量都...