打卡信奥刷题(1601)用C++实现信奥 P7159 「dWoi R1」Sweet Fruit Chocolate

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 n1 行每行两个正整数 u , v u,v u,v ( 1 ≤ u , v ≤ n ) (1\le u,v\le n) (1u,vn),代表有树中一条边 ( 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 n20

对于另外 30 % 30\% 30% 的数据,满足 u = v − 1 u=v-1 u=v1

对于 100 % 100\% 100% 的数据,满足 2 ≤ n ≤ 1 0 6 2\le n\le 10^6 2n106 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值