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 usingnamespace
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走到根需要乘...