记录编号 23712 评测结果 AAAAAAAAAA
题目名称 立春树 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.415 s
提交时间 2011-03-18 07:41:19 内存使用 4.45 MiB
显示代码纯文本
#include <cstdio>

typedef long long s64;

const s64 MAXN=100005;

struct Node
{
	s64 v;
	Node *next;
	Node(s64 _v,Node *_next):
		v(_v),next(_next){}
}*adj[MAXN];

inline void addedge(s64 u,s64 v)
{
	adj[u]=new Node(v,adj[u]);
}

s64 N;
s64 T[MAXN],C[MAXN];
s64 mincost[MAXN];
s64 cost[MAXN],placed[MAXN];
void greed(s64 u)
{
	if (adj[u]==NULL)
	{
		cost[u]=T[u]*C[u];
		placed[u]=C[u];
		return ;
	}
	for(Node *p=adj[u];p;p=p->next)
		greed(p->v);
	for(Node *p=adj[u];p;p=p->next)
	{
		placed[u]+=placed[p->v];
		cost[u]+=cost[p->v];
		if (mincost[p->v]<mincost[u])
			mincost[u]=mincost[p->v];
	}
	if (placed[u]<C[u])
	{
		cost[u]+=mincost[u]*(C[u]-placed[u]);
		placed[u]=C[u];
	}
}

int main()
{
	freopen("tdec.in","r",stdin);
	freopen("tdec.out","w",stdout);
	scanf("%lld",&N);
	for(int i=1;i<=N;i++)
	{
		s64 P;
		scanf("%lld%lld%lld",&P,C+i,T+i);
		if (P!=-1)
			addedge(P,i);
		mincost[i]=T[i];
	}
	greed(1);
	printf("%lld\n",cost[1]);
	return 0;
}