求助,40pts
查看原帖
求助,40pts
160839
Prean楼主2020/11/2 14:07

WA on 2,输入数据后输出为0 0。。。

然后 DEBUG 了一下发现只便利了 1 号节点,有 dalao 帮忙康康吗/kel

#include<cstdio>
const int M=2e5+5,mod=10007;
int n,ans1,ans2,d[M],f[M],mx[M],smx[M],sum[M],val[M];
struct Edge{
	int to;Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline int max(const int&a,const int&b){
	return a>b?a:b;
}
inline int add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int del(const int&a,const int&b){
	return a-b<0?a-b+mod:a-b;
}
inline void Add(const int&u,const int&v){
	*cnt=(Edge){v,h[u]};h[u]=cnt++;
	*cnt=(Edge){u,h[v]};h[v]=cnt++;
}
void DFS1(int u){
	for(Edge*E=h[u];E;E=E->nx){
		int v=E->to;
		if(v==f[u])continue;
		++d[f[v]=u];DFS1(v);
		sum[u]=add(sum[u],val[v]);
		if(val[v]>=mx[u])smx[u]=mx[u],mx[u]=val[v];
		else if(val[v]>smx[u])smx[u]=val[v];
	}
}
void DFS2(int u){
	for(Edge*E=h[u];E;E=E->nx){
		int v=E->to;
		if(v==f[u])continue;
		DFS2(v);
		ans1=max(ans1,val[u]*mx[v]%mod);
		ans2=add(ans2,val[u]*sum[v]%mod);
	}
	ans1=max(ans1,val[u]*(val[u]==mx[f[u]]?smx:mx)[f[u]]%mod);
	if(f[u]){
		if(d[f[u]]==1)ans2=add(ans2,val[u]*del(sum[f[u]],val[u])%mod);
		else ans2=add(ans2,val[u]*del(sum[f[u]],val[u])%mod*5004%mod);
	}
}
signed main(){
	register int i,u,v;
	scanf("%d",&n);
	for(i=1;i<n;++i){
		scanf("%d%d",&u,&v);
		Add(u,v);
	}
	for(i=1;i<=n;++i)scanf("%d",val+i);
	DFS1(1);DFS2(1);
	printf("%d %d",ans1,add(ans2,ans2));
}
2020/11/2 14:07
加载中...