比赛 |
“Asm.Def战记之太平洋”杯 |
评测结果 |
|
题目名称 |
Asm.Def的基本算法 |
最终得分 |
0 |
用户昵称 |
liuyu |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2018-11-07 18:34:05 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int Mod=1e9+7;
const int N=150000+10;
int n,m,w[N],fa[N][20],deep[N];
vector<int>v[N];
ll ans=0,sum[N],SUM=0;
void dfs(int x){
deep[x]=deep[fa[x][0]]+1;
for(int i=0;fa[x][i];i++)
fa[x][i+1]=fa[fa[x][i]][i];
for(int i=0;i<v[x].size();i++)
dfs(v[x][i]);
}
int lca(int x,int y){
if(deep[x]<deep[y])swap(x,y);
for(int i=19;i>=0;i--)
if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
if(x==y)return x;
for(int i=19;i>=0;i--)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
void dfs2(int x){
sum[x]=w[x];
for(int i=0;i<v[x].size();i++){
dfs2(v[x][i]);
ans=(ans+(ll)(sum[x]*sum[v[x][i]]%Mod*w[x]%Mod))%Mod;
sum[x]=(ll)(sum[v[x][i]]+sum[x])%Mod;
}
}
int main(){
//freopen("a.in","r",stdin);
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>w[1];SUM=1ll*w[1]*w[1]%Mod*w[1]%Mod;
for(int i=2;i<=n;i++){
int x,y;
cin>>x>>y;
SUM=(SUM+1ll*y%Mod*y%Mod*y%Mod)%Mod;
v[x].push_back(i);
fa[i][0]=x;
w[i]=y;
}
if(n<=1000)
{
dfs(1);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int lc=lca(i,j);
ans=(ans+((1ll*w[i]%Mod*w[j])%Mod)*w[lc]%Mod)%Mod;
}
}
cout<<ans<<endl;
}else
{
dfs2(1);//cout<<ans<<endl;
ans=(1ll*ans*2)%Mod;
//ll summ=0;
ans=(ans+SUM)%Mod;
//for(int i=1;i<=n;i++)ans=(ans+(1ll*(w[i]*w[i]%Mod)*w[i]%Mod))%Mod;
//cout<<SUM<<endl;
//cout<<n<<endl;
cout<<ans%Mod<<endl;
///cout<<(ll)(((1ll*(w[1]%Mod)*w[1])%Mod)*w[1]%Mod)<<endl;
}
return 0;
}