比赛 |
“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;
}