求助为何90
查看原帖
求助为何90
235901
Always_Remember_It楼主2024/3/18 13:14
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+10;
const int Mod=10007; 
int n,w[N];
int f[N];//每个节点的父节点 
int sum[N];//每个节点的子节点权值和 
int now[N];//每个节点中子节点联合权值和 
int maxn[N];//每个节点的一对子节点联合权值最大值 
int ans1;//其余情况的联合权值和
int ans2;//其余情况联合权值最大值 
int head[N],tot;
struct Edge{
	int next,to;
}e[N];
void adde(int u,int v){
	e[++tot].next=head[u];
	e[tot].to=v;
	head[u]=tot;
	return;
}
void dfs1(int u,int fa){
	int m1=0,m2=0;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==fa) continue;
		dfs1(v,u);
		f[v]=u;
		if(w[v]>m1) m2=m1,m1=w[v];
		else if(w[v]>m2) m2=w[v];
		sum[u]=(sum[u]+w[v])%Mod;
		maxn[u]=max(maxn[u],maxn[v]);
	}
	maxn[u]=max(maxn[u],m1*m2);
	return; 
}
void dfs2(int u){
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==f[u]) continue;
		dfs2(v);
		now[u]+=now[v];
		now[u]+=(sum[u]-w[v])*w[v];
		now[u]%=Mod;
	}
	return;
}
void dfs3(int u){
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==f[u]) continue;
		dfs3(v);
	}
	int fu=f[f[u]];
	int val=w[u]*w[fu];
	if(fu) ans1=(ans1+val*2)%Mod,ans2=max(ans2,val);
	return;
}
inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<1)+(s<<3)+(ch^48);
		ch=getchar();
	}
	return s*f;
}
signed main(){
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		adde(u,v);
		adde(v,u);
	}
	for(int i=1;i<=n;i++){
		w[i]=read();
	}
	dfs1(1,1);
	dfs2(1);
	dfs3(1);
	cout<<max(maxn[1],ans2)<<" "<<(now[1]+ans1)%Mod<<endl;
	return 0;
}
2024/3/18 13:14
加载中...