比赛 2024暑假C班集训B 评测结果 AAAAAAAAAA
题目名称 Asm.Def的基本算法 最终得分 100
用户昵称 Untitled 运行时间 0.112 s
代码语言 C++ 内存使用 4.30 MiB
提交时间 2024-07-11 09:54:37
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
//typedef long long ll;
 
ll const N=100010,mod=1e9+7;
ll n,idx;
ll res,w[N],siz[N];
ll head[N],Next[N],ver[N],fat[N];
 
ll tim(ll a,ll b){
	return (a*b)%mod;
}
 
void edge(ll a,ll b){
	Next[++idx]=head[a],head[a]=idx,ver[idx]=b;
	return;
}
 
void getSiz(ll p){
	siz[p]=w[p]%mod;
	for (ll i=head[p];i;i=Next[i]){
		getSiz(ver[i]);siz[p]+=siz[ver[i]],siz[p]%=mod;
	}
	return;
}
 
void getRes(ll p){
	ll s=siz[p];
	res+=tim(tim(w[p],w[p]),s*2-w[p]);
	for (ll i=head[p];i;i=Next[i]){
		res+=tim(tim(siz[ver[i]],s-siz[ver[i]]-w[p]),w[p]);
		getRes(ver[i]);
	}
	return;
}
 
int main(){
	freopen("asm_algo.in","r",stdin);
	freopen("asm_algo.out","w",stdout);
	
	ll pt;
	ll si;
	scanf("%d %lld",&n,&w[1]);
	for (ll i=2;i<=n;i++){
		scanf("%d %lld",&pt,&si);
		edge(pt,i);fat[i]=pt,w[i]=si;
	}
	getSiz(1);
	getRes(1);
	printf("%lld",res%mod);
	
	return 0;
}