CF1088F Ehab and a weird weight formula(树上最优性问题、贪心+倍增)
生活随笔
收集整理的這篇文章主要介紹了
CF1088F Ehab and a weird weight formula(树上最优性问题、贪心+倍增)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
給出一棵 n 個結點的樹,點 i 有正權值 wiw_iwi?,wiw_iwi? 互不相同。
除了權值最小的點,保證每個點 u 都有一個鄰點 v 使得 wvw_vwv? < wuw_uwu?。
構造一棵樹,最小化代價:
- 對于每個點 u,產生 degu×wudeg _u \times w_udegu?×wu? 的代價,其中 degudeg _udegu? 是構造的樹中 u 的度數。
- 對于每條邊 (u, v),產生 ?log2dis(u,v)?×min(wu,wv)?log_2dis(u, v)? \times min(w_u, w_v)?log2?dis(u,v)?×min(wu?,wv?) 的代價,其中dis(u, v) 是給出的樹中 u, v 的距離。
n ≤ 5×1055 \times 10^55×105
Solution
- 首先要會利用題目中給的 wv<wuw_v<w_uwv?<wu? 的性質,可以發現這個性質在樹上加上只有一個最小值的條件是可以得到這個結論的:除最小值外,每個點都有且僅有一個與他相鄰的點 v 權值小于它。
因為對于點 u ,如果有一個點 v 小于它,那么就要需要另外一個點去小于 v ,那這種依賴只會在最小值的時候停止,但是整棵樹只有一個最小值,所以每個點也只能有且僅有一個點小于它。 - 于是題目那個描述詭異的限制變成了:以權值最小的點為根,每個點的權值均大于父親權值。
- 把點的代價放進邊:(u, v) 代價為(?log2dis(u,v)?+1)?min(wu,wv)+max(wu,wv)(?log_2dis(u, v)? + 1) ? min(w_u, w_v) + max(w_u, w_v)(?log2?dis(u,v)?+1)?min(wu?,wv?)+max(wu?,wv?)
- 按照 kruskal,對于任意一點 u,與 u 相連的最小權值的邊 (u, v) 一定在 MST 中。
- 枚舉每個點,找與其相連的最小權值的邊:
如果一個點 x 選中了它子樹中的某個點相連,那么它還不如選擇權值更小的祖先,代價更小。
如果一個點 x 選中了深度小于它的非祖先節點,那么它還不如從它選擇的這個節點往上走,走到一個離它最近的,是 x 的祖先的節點,因為這個新節點肯定比原來選擇的節點距離 x 更近,且權值更小,所以顯然更優。
- 因此對于除根結點外的所有點 u,v 一定是它的 2k2^k2k 級祖先或者根結點。倍增求解。
- 這些邊恰好組成 MST,直接枚舉找到它們。
Code
#include<iostream> #include<cstdio> using namespace std; const int N=5e5+5; const long long inf=1e18; struct Edge{int v,nxt; }edge[N<<1]; int n,head[N],cnt,w[N],rt,fa[N][22],dep[N]; long long res,ans; void add(int u,int v){edge[++cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt; } void dfs(int u){if(u!=rt){int j;for(j=1;j<=20;j++){if(dep[u]<(1<<j)) break;fa[u][j]=fa[fa[u][j-1]][j-1];}res=inf;for(j=0;j<=20;j++){if(dep[u]<(1<<j)) break;res=min(res,1ll*(j+1)*w[fa[u][j]]+w[u]);}if(dep[u]!=(1<<j))res=min(res,1ll*(j+1)*w[rt]+w[u]);ans+=res;}for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if(v==fa[u][0]) continue;fa[v][0]=u;dep[v]=dep[u]+1;dfs(v);} } int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&w[i]);if(!rt) rt=i;else if(w[rt]>w[i]) rt=i;}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(rt);printf("%lld\n",ans);return 0; }參考文章:
https://www.luogu.com.cn/blog/qlwpc/cf1088f-ti-xie
總結
以上是生活随笔為你收集整理的CF1088F Ehab and a weird weight formula(树上最优性问题、贪心+倍增)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈佛家训中的好词好句
- 下一篇: 火车站一般早上几点开始卖票 火车站提前多