卷
本题就是一个思路,dp数据(乘法)过大时,可以考虑取log,比较的时候再计算答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod=1e9+7;
const int N=2e5+5;
int w[N],n,head[N],cnt=0;
struct edge{
int link,v;
}q[N<<1];
void put(int u,int v){
q[++cnt].v=v;
q[cnt].link=head[u];
head[u]=cnt;
}
double dp[N][2],ww[N];
void dfs(int s,int fa){
dp[s][1]=ww[s];dp[s][0]=0;
double tp1=0,tp2=0;
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
dfs(v,s);
tp1=tp1+max(dp[v][1],dp[v][0]);
tp2=tp2+dp[v][0];
}
dp[s][0]=dp[s][0]+tp1;
dp[s][1]=dp[s][1]+tp2;
}
int ans=1;
void dfs2(int s,int fa,bool flag){
if(flag){
if(dp[s][1]>dp[s][0]){
ans=1ll*ans*w[s]%mod;
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
dfs2(v,s,0);
}
}
else {
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
dfs2(v,s,1);
}
}
}
else{
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
dfs2(v,s,1);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
ww[i]=log2(w[i]);
}
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
put(u,v),put(v,u);
}
dfs(1,1);
dfs2(1,1,1);
printf("%d",ans);
}