塔子哥的完整二叉树-小米2023笔试(codefun2000)
创始人
2024-11-11 18:35:23

题目链接
塔子哥的完整二叉树-小米2023笔试(codefun2000)

题目内容

塔子哥有一棵节点数为 n 的完整二叉树,对于一个完整二叉树的定义是:要么每个节点有两个子节点,要么每个节点没有子节点。

  • 没有子节点的节点,其权值为 1 。
  • 有两个子节点的节点,其权值为两个儿子节点的权值的运算结果。

每个节点有两种运算,要么为加法,要么为乘法。如下给出一个长度为 n 的数组 c 。
ci =0 表示节点 i 的运算是加法,ci=1 表示节点 i 的运算是乘法。
现在,塔子哥问你这个完整二叉树的根节点的权值是多少。

输入描述

第一行,一个正整数 n( 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1≤n≤105) 表示完整二叉树中的节点个数。
第二行,n−1 个正整数 p[2,3,…,n],pi 表示第 i 个节点的父节点,1 号节点是根节点。
第三行,n 个整数 c[1,2,…,n] ,含义如题面描述所示
数据保证形成满足题目描述的二叉完整树。

输出描述

一个整数,表示根节点的值,答案对 1 0 9 + 7 10^9 +7 109+7 取模。

样例1

输入

3
1 1
1 1 1

输出

1

样例1解释

2 号节点和 3 号节点权值均为 1 ,1 号节点是乘法运算,故 1 号节点的权值为 1 。

题解1

#include using namespace std; typedef long long LL; const int N = 1e5 + 10; const LL MOD = 1e9 + 7;  int n, p[N], c[N]; vector edge[N]; bool vis[N];  LL dfs(int u){ 	vis[u] = 1; 	int sz = int(edge[u].size()); 	if(!sz) return 1; 	LL left = dfs(edge[u][0]); 	LL right = dfs(edge[u][1]); 	if(!c[u]) return (left + right)%MOD; 	else return (left * right)%MOD;  } int main(){ 	scanf("%d", &n); 	for(int i = 2; i <= n; i++){ 		scanf("%d", &p[i]); 		edge[p[i]].emplace_back(i); 	} 	for(int i = 1; i <= n; i++) scanf("%d", &c[i]); 	printf("%lld\n", dfs(1)); 	return 0; }  

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...