比赛 “Asm.Def战记之太平洋”杯 评测结果 AWWWTTTTTT
题目名称 Asm.Def的基本算法 最终得分 10
用户昵称 slyterlins 运行时间 6.020 s
代码语言 C++ 内存使用 1.07 MiB
提交时间 2015-11-02 11:32:39
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int n,m;
int lca(int,int);
int ww[100005];
int pre[100005];
inline void addedge(int a,int b){
	pre[a]=b;
}
inline int get(int a,int b){
	if(a==b)return a;
	if(pre[a]==a)return a;
	if(pre[b]==b)return b;
	if(pre[a]==b)return b;
	if(pre[b]==a)return a;
	if(pre[a]==pre[b])return pre[a];
	else{
		int o;
		o=max(get(pre[a],b),get(b,pre[a]));
		return o;
	}
}
int lca(int a,int b){
	if(a==b){
		return ww[a]*ww[a]*ww[a];
	}
	else{
		int xx=get(a,b);
		return ww[xx]*ww[a]*ww[b];
	}
}
int main()
{
	freopen("asm_algo.in","r",stdin);
    freopen("asm_algo.out","w",stdout);
	long long ans=0;
	cin>>n>>m;
	if(n==1){cout<<m*m*m;return 0;}
	pre[1]=1;
	ww[1]=m;;
	for(int i=2;i<=n;i++){
		int a,b;
		cin>>a>>ww[i];
		addedge(i,a);
	}
	for(int i=1;i<=n;i++)
	   for(int j=i+1;j<=n;j++)                     
	   {
	   ans=(lca(i,j)+ans)%1000000007;    
     //	cout<<lca(i,j)<<' '<<ans<<endl;
		   }ans*=2;
	for(int i=1;i<=n;i++) ans+=ww[i]*ww[i]*ww[i];	   
	   cout<<ans%1000000007;
	   return 0;
}