思路
不要想复杂就好了...
贪心的选取子树中最小的那个,多了就不要选,少了就更新数量...
一个dfs就可以解决了..
代码
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; typedef long long ll; vector<int>g[N]; int w[N],least[N],sz[N]; ll dfs(int u) { ll res=0; for(int v:g[u]) { res+=dfs(v); w[u]=min(w[u],w[v]); sz[u]+=sz[v]; } if(sz[u]<least[u]) res+=(least[u]-sz[u])*w[u],sz[u]=least[u]; return res; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int v; scanf("%d%d%d",&v,&least[i],&w[i]); if(v==-1) continue; g[v].push_back(i); } cout<<dfs(1)<<'\n'; return 0; }