5 1 2 3 4 5 1 2 1 3 2 4 2 5
12
#includeusing namespace std; int val[100001],dp[100001],son[100001],gson[100001],first[100001],next[200002],to[200002],que[100001],far[100001]; bool vis[100001]; int main() { int n,i,u,v,ans; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) first[i]=-1,vis[i]=son[i]=gson[i]=dp[i]=0; for(i=1;i<=n;i++) scanf("%d",&val[i]); for(i=0;i =0;i--)//從樹的最下面一層開始往上推 { dp[que[i]]=val[que[i]]+gson[que[i]]>son[que[i]]?val[que[i]]+gson[que[i]]:son[que[i]]; ans=ans>dp[que[i]]?ans:dp[que[i]]; if(far[que[i]]!=-1) { son[far[que[i]]]+=dp[que[i]];//更新父節點的son值 if(far[far[que[i]]]!=-1) gson[far[far[que[i]]]]+=dp[que[i]];//更新祖父節點的gson值 } } printf("%d\n",ans); } }