51 nod 苹果曼和树

2023-12-07 03:58
文章标签 51 苹果 nod 曼和树

本文主要是介绍51 nod 苹果曼和树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1500 苹果曼和树

题目来源: CodeForces

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

 收藏

 关注

 

苹果曼有一棵n个点的树。有一些(至少一个)结点被标记为黑色,有一些结点被标记为白色。

现在考虑一个包含k(0 ≤ k < n)条树边的集合。如果苹果曼删除这些边,那么会将这个树分成(k+1)个部分。每个部分还是一棵树。

现在苹果曼想知道有多少种边的集合,可以使得删除之后每一个部分恰好包含一个黑色结点。答案对1000000007 取余即可。

 

Input

单组测试数据。

第一行有一个整数n (2 ≤ n ≤ 10^5),表示树中结点的数目。

第二行有n-1个整数p[0],p[1],...,p[n-2] (0 ≤ p[i] ≤ i)。表示p[i](i+1)之间有一条边。结点从0开始编号。

第三行给出每个结点的颜色,包含n个整数x[0],x[1],...,x[n-1] (x[i]0或者1)。如果x[i]1,那么第i个点就是黑色的,否则是白色的。

Output

输出答案占一行。

Input示例

3

0 0

0 1 1

Output示例

2

System Message (题目提供者)

C++的运行时限为:1000 ms ,空间限制为:131072 KB 


题解:本道题是树形dp一类题目(方案树)的通用解题方法,就是考虑每个节点与其儿子节点的合法关系更具乘法原理统计方案。对于题目的条件,可以简化问题:将给定的树分为k个联通块,每个联通块有且仅有一个黑点。抓住关键条件:有且仅有一个黑点,

那么对于每个节点,就用dp【i】【0】表示以i为根节点的子树中删边后i所在的联通块没有黑点的方案数,dp【i】【1】表示以i为根节点的子树中删完边后i所在的联通块有一个黑点的方案数。

分情况讨论:

i为黑点:对于儿子节点son,若son所在的联通块有一个黑点,那就断开i与son的边,方案数为dp【i】【1】*dp【son】【1】;若son所在的联通块没有黑点,那就保留i与son的边,方案数为dp【i】【1】*dp【son】【0】(dp的巧妙在于没有讨论删边,直接讨论点与点的情况)。所以i为黑点的dp【i】【1】点总方案数为:dp【i】【1】=(dp【i】【1】*(dp【son】【1】+dp【son】【0】));那么dp【i】【0】喃,很显然,因为i为黑点,dp【i】【0】点值永远为0不必讨论。

i为白点:对于儿子son,若son所在的联通块没有黑点可以保留也可以删边,对于son所在的联通块有一个黑点,则删边。所以dp【i】【0】=dp【i】【0】*(dp【son】【1】+dp【son】【0】);因为每个联通块至少要有一个黑点。所以dp【i】【1】=(dp【i】【1】*(dp【son】【1】+dp【son】【0】)+dp【i】【0】*dp【son】【1】)

总结:做树形dp的题一定要弄清楚关系,儿子与父亲的关系,有时更行关系并不仅限于父亲和儿子,还有可能是儿子与祖先。对于题目中的一些操作(此题中的删边),当很难枚举和表示时,通常可以通过表示其他状态来间接表示这些操作,毕竟操作就是改变状态。树形dp中的方案数问题通常都要用到乘法原理。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define N 300000
#define mod 1000000007
using namespace std;
int n;
int last[N<<1],to[N<<1],head[N],cnt=0;
int v[N];
long long dp[N][3];
void ins(int u,int v){last[++cnt]=head[u];head[u]=cnt;to[cnt]=v;
}
void dfs(int x,int fa)
{dp[x][v[x]]=(long long)1;for(int i=head[x];~i;i=last[i]){if(to[i]==fa) continue;dfs(to[i],x);dp[x][1]=(dp[x][1]*(dp[to[i]][1]+dp[to[i]][0])%mod+dp[x][0]*dp[to[i]][1])%mod;dp[x][0]=(dp[x][0]*(dp[to[i]][1]+dp[to[i]][0]))%mod;}
}
int main()
{
//	freopen("in.txt","r",stdin);memset(head,-1,sizeof(head));int tmp;scanf("%d",&n);for(int i=0;i<n-1;i++){scanf("%d",&tmp);ins(i+1,tmp);ins(tmp,i+1);}for(int i=0;i<n;i++) scanf("%d",&v[i]);dfs(0,-1);printf("%lld",dp[0][1]);return 0;
}


这篇关于51 nod 苹果曼和树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464410

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?

在宏大的世界观游戏中,《黑暗之魂2:原罪学者》脱颖而出,以其探索性和挑战性征服了全球玩家的心灵。下面我们来看看《黑暗之魂2:原罪学者》是什么类型的游戏,《黑暗之魂2:原罪学者》可以在苹果电脑玩吗的相关内容。 一、《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂2:原罪学者》作为《黑暗之魂2》的增强版和重制版,是一款FromSoftware制作、BANDAI NAMCO和FromSoft

【C++题解】1272. 郭远摘苹果

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》 问题:1272. 郭远摘苹果 类型:二维数组 题目描述: 郭远有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,郭远身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设郭远会走过每一棵苹果树),问在郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差是多少?

硬刚苹果还得是华为

文|琥珀食酒社 作者 | 璇子 牛皮啊 华为发三折叠不意外 意外的是 这各种翻转简直颠覆想象 市面上没见过这么能“翻转”的? 要不怎么说硬刚苹果 还得看华为 就跟你同天怎么了? 拼创新、拼技术、拼热度 你就说哪比你差吧? iPhone 16做的改进 很多手机都能做,可能还早做了 但Mate XT三折叠 别人想做也做不了 不说引领时代啊 至少在折叠机领域又开

苹果账号登录后端验证两种方式 python2

import jsonimport jwt import requests import json import base64def decode_jwt(jwt_token):try:header,payload,sign = jwt_token.split('.')except:return {},{},""header = json.loads(base64.urlsafe_b6

基于51单片机的智能小车转向控制系统设计与实现

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

嵌入式软件--51单片机 DAY 4

一、蜂鸣器 当电流通过线圈时会产生电磁场,电磁场与永磁体相互作用,从而使金属膜产生震动而发声。为使金属膜持续震动,蜂鸣器需要使用震荡电路进行驱动。有些蜂鸣器元件内部自带震荡驱动电路,这种蜂鸣器叫做有源蜂鸣器(Active Buzzer,自激式蜂鸣器);而有些则不带震荡驱动电路,这种蜂鸣器叫做无源蜂鸣器(Passive Buzzer,它激式蜂鸣器)。 1.原理图 2.软件实现 Int_B