BZOJ 3573 公尺特運輸

2022-05-13 11:12:35 字數 1269 閱讀 3379

bzoj 3573 傳送門

一道語文題

轉化後的題意就是使得每個節點的權值都等於 父親節點的權值/兒子數 的最小運算元

能發現一條重要的性質:只要乙個節點確定,所有節點的權值都確定了

於是我們只要列舉$1……n$每個節點權值不變,

算出根節點$root$的權值出現過的最多次數$res$,用$n-res$即是結果

但如果$o(n^2)$列舉不僅tle,而且會爆精度

於是我們將權值都用$log$來表示:

(1)算出當根節點$root$為「單位一」:$log(1)$時,各個節點的權值$t_i$

(2)對於節點$v$,$t_v*log(原權值)$就能算出此時根節點在$log$下的權值,接著統計即可

#include using

namespace

std;

const

int maxn=5e5+10

;const

double eps=1e-6

;double

t[maxn],top[maxn];

intn,dat[maxn],siz[maxn];

vector

g[maxn];

void dfs(int x,int

anc)

}int

main()

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

t[1]=log(1);dfs(1,0

);

for(int i=1;i<=n;i++) top[i]=t[i]+log(dat[i]);

sort(top+1,top+n+1

);

int res=0,cur=1

;

for(int i=2;i<=n;i++)

if(top[i]-top[i-1];

else res=max(res,cur),cur=1

; res=max(res,cur);

printf("%d

",n-res);

return0;

}

1、出現只涉及比較,但不用輸出確切值的高精度問題時,

使用$log$或$hash$即可,不用高精度類

2、「單位一」的使用

這裡的「單位一」用得很妙啊,

如果每次只要乘上相應倍數即可$o(1)$得解,可以用「單位一」的思想先預處理

bzoj 3573 Hnoi2014 公尺特運輸

題目好難懂。簡述題意 給出一棵樹,要求滿足兩個要求 1.每個節點的子節點權值相等。2.每個節點的權值和是這個節點的權值。然後就出最小修改點的數量來滿足這個要求。那麼顯而易見只要確定乙個節點就可以確定群圖節點權值。這樣列舉是 通過這個結論我們發現只要確定1就可以確定全圖,所以可以通過讓每乙個節點權值不...

BZOJ 3573 Hnoi2014 公尺特運輸

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

BZOJ3573 Hnoi2014 公尺特運輸

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