提交时间:2023-12-09 09:22:30

运行 ID: 24068

#include<iostream> #include<cstring> #include<bitset> using namespace std; #define int long long #define memoryMB(x) (sizeof(x)>>20) inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=200100,P=998244353; inline int fpow(int a,int b){ int c=1; for(;b;b>>=1,a=a*a%P)if(b&1)c=c*a%P; return c; } int n,a[N],head[N],to[N<<1],nex[N<<1],F[N]; void get_F(int nd,int fa){ F[nd]=fa; for(int i=head[nd];i;i=nex[i])if(to[i]!=fa)get_F(to[i],nd); } void init(){ cin>>n; for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; } get_F(1,0); } int cnt; bool tag[N]; void dfs(int nd,int fa,int dis){ if(!tag[nd]&&a[nd]>=dis)cnt++; else tag[nd]=true; for(int i=head[nd];i;i=nex[i])if(to[i]!=fa)dfs(to[i],nd,dis+1); } int ans; signed main(){ // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); init(); for(int i=1;i<=n;i++){ if(i%100==0)cerr<<i<<endl; memset(tag,0,sizeof(tag)); cnt=0; dfs(i,0,0); // cerr<<cnt<<" "; ans=(ans+fpow(3,cnt))%P; cnt=0; if(F[i])dfs(F[i],0,0),ans=(ans-fpow(3,cnt))%P;//cerr<<cnt<<' '; else ans--; // cerr<<endl; } cout<<(ans+P)%P<<endl; // cerr<<memoryMB(f)<<'\n'; return 0; }