P7159 「dWoi R1」Sweet Fruit Chocolate
题目背景
我们的东条妈妈在残害了梦野之后,还想继续她的事业,残害可怜的最原。她发现最原很喜欢吃甜甜的巧克力,另外还有一种东西叫做西西弗水果,他富含营养但没那么好吃,因此,她想把这些巧克力淋在西西弗水果上。
题目描述
东条把想淋的巧克力做成了一个巧克力喷泉树。巧克力喷泉树是一棵 n n n 个节点的树。每个节点都有一个西西弗水果。对于每一个节点 u u u,你有两种选择:你可以在节点 u u u 放置 a u a_u au 个水果,也可以一个水果都不放。然后,东条会在根节点往下淋巧克力汁。节点 u u u 给最原带来的营养值是 u u u 及其子树中所放置的西西弗水果的数量。东条想要知道,对于所有 2 n 2^n 2n 个放水果方案,最原所获得的营养值之和的总和是多少。答案对 998244353 998244353 998244353 取余。
树的根节点为 1 1 1。
输入格式
第一行一个正整数 n n n。
第二行 n n n 个正整数 a i a_i ai。
后面 n − 1 n-1 n−1 行每行两个正整数 u , v u,v u,v ( 1 ≤ u , v ≤ n ) (1\le u,v\le n) (1≤u,v≤n),代表有树中一条边 ( u , v ) (u,v) (u,v)。
输出格式
一行,一个整数代表答案。
输入输出样例 #1
输入 #1
3
1 1 2
1 2
2 3
输出 #1
36
说明/提示
样例 1 解释
用 S S S 表示选中状态
- S = 000 S=000 S=000 贡献 0 0 0
- S = 001 S=001 S=001 贡献 1 1 1
- S = 010 S=010 S=010 贡献 2 2 2
- S = 011 S=011 S=011 贡献 3 3 3
- S = 100 S=100 S=100 贡献 6 6 6
- S = 101 S=101 S=101 贡献 7 7 7
- S = 110 S=110 S=110 贡献 8 8 8
- S = 111 S=111 S=111 贡献 9 9 9
数据规模与约定
对于 20 % 20\% 20% 的数据,满足 n ≤ 20 n\le 20 n≤20。
对于另外 30 % 30\% 30% 的数据,满足 u = v − 1 u=v-1 u=v−1。
对于 100 % 100\% 100% 的数据,满足 2 ≤ n ≤ 1 0 6 2\le n\le 10^6 2≤n≤106, 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109。
C++实现
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
const int mod=998244353;
int n,ans,p,dep[N],val[N];
vector<int>a[N];
void dfs(int u,int f){
dep[u]=dep[f]+1;
for(auto v:a[u]){
if(v==f) continue;
dfs(v,u);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n;
p=1;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
p=p*2%mod;
}
dfs(1,0);
for(int i=1;i<=n;i++){
ans=(ans+1ll*val[i]*dep[i]%mod)%mod;
}
ans=1ll*ans*p%mod;
cout<<ans;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容