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