1. 程式人生 > >洛谷——P3018 [USACO11MAR]樹裝飾Tree Decoration

洛谷——P3018 [USACO11MAR]樹裝飾Tree Decoration

sin add long == code color blank pac sum

P3018 [USACO11MAR]樹裝飾Tree Decoration

比較水的一道樹上模擬水題,更新每個點的價值為以這個點為根的子樹中的價值最小值,同時更新以每個節點為根的$sum$值,即以這個節點為根的子樹的禮物數,

如果$sum$值小於自身所規定數,就用最小值來計算剩余價值。

#include<iostream>
#include<cstdio>
#include<algorithm>

#define N 1000000
#define inf 0x7fffffff
#define LL long long
using namespace
std; LL n,val[N],d[N],f[N],s[N]; LL ans; LL head[N],tot; struct node{ LL to,next; }e[N]; void add(LL u,LL v){ e[++tot].to=v,e[tot].next=head[u],head[u]=tot; } void dfs(LL u){ for(LL i=head[u];i;i=e[i].next){ LL v=e[i].to; if(v==f[u]) continue; dfs(v); val[u]
=min(val[u],val[v]); s[u]+=s[v]; } if(s[u]<d[u]) ans+=(d[u]-s[u])*val[u],s[u]=d[u]; } int main() { scanf("%lld",&n); for(LL i=1;i<=n;i++){ scanf("%lld%lld%lld",&f[i],&d[i],&val[i]); add(i,f[i]),add(f[i],i); } for(LL i=1
;i<=n;i++){ if(f[i]==-1){ dfs(i); printf("%lld\n",ans); break; } } return 0; }

洛谷——P3018 [USACO11MAR]樹裝飾Tree Decoration