原題鏈結
題目麻煩的一批。下面直接給簡化版:
給一棵樹,每個點有乙個權值,要求修改一些點的權值,使得:
①同乙個父親的兒子權值必須相同
②父親的取值必須是所有兒子權值之和
問最小要修改幾個點。
很顯然這是乙個樹形dp。
由於這個要求,樹上只要有乙個點確定,全樹的權值就都確定了。那麼我們只要計算將路徑上權值的累乘積和計算到這裡度的累乘積即為\(f[i]\),\(f[i]\)相同的表示他們同屬於同一種合法方案,最後\(sort\)一遍尋找相同最多的即可。最後輸出\(n-maxn\)。
注意將所有權值累乘會爆\(long long\),但使用高精度太麻煩,巧妙運用\(log\)轉為加法。(小技巧)
#includeusing namespace std;
const double minn=1e-6;
const int maxn=500000+3;
struct node a[maxn*2];
double val[maxn];
int v[maxn],head[maxn],s[maxn],cnt;
void add(int x,int y)
void dfs(int x,int fa,double ans)
}int main()
s[1]++;
dfs(1,0,0);
sort(val+1,val+1+n);
for(int i=2;i<=n;i++){
if(val[i]-val[i-1]幸甚至哉,歌以詠志。
HNOI2014 公尺特運輸
顯然知道乙個節點就可以推出整棵樹 然而直接乘會爆longlong 所以考慮取log 最後排序算眾數即可 include include include include include include define il inline define rg register define fill a,...
HNOI2014 公尺特運輸
公尺特是d星球上一種非常神秘的物質,蘊含著巨大的能量。在以公尺特為主要能源的d星上,這種公尺特能源的運輸和儲存一直是乙個大問題。d星上有n個城市,我們將其順序編號為1到n,1號城市為首都。這n個城市由n 1條單向高速通道連線起來,構成一棵以1號城市 首部 為根的樹,高速通道的方向由樹中的兒子指向父親...
HNOI2014 公尺特運輸
首先我們需要看懂題目 然後我們需要發現乙個結論 只要有乙個節點的權值確定,那麼整棵樹的權值就確定了 然後我們根據這張,可以設 f i a i cdot prod f mathrm f 其中 f 是 i 的祖先,mathrm f 表示 f 的子節點的個數,a i 表示 i 的權值 於是我們可以用顯然法...