Birds in the tree题解报告

链接:https://ac.nowcoder.com/acm/contest/33190/D
来源:牛客网

题目描述
One day, when NIO was walking under the tree, he found that there are birds standing on the tree, and each bird is standing on one leaf. He wondered about in how many sub-trees form by connected vertex-induced subgraphs from the original tree, all birds are in the same gender. The number would be very large, just mod 10^9+7 in the output.
输入描述:
There are multiple input cases.
For each case, the first line contains an integer, n, denoting the number of nodes on the tree. The second line is a binary string, where 1 denotes the male birds and 000 denotes the female birds.
Following by n−1 lines. In each line there are two integers, xi,yi ​, denoting there is a path connecting node x and node y.
1≤n≤3×105,1≤xi,yi≤N
输出描述:
Output a number module 10^9+7, the number of subgraphs of the given tree that form trees where all its leaves are the same color.
示例1
输入
复制
7
1011111
1 2
1 3
2 4
3 5
2 6
4 7
输出
复制
28
题目大意:
给定包含n个节点的树,每个节点具有颜色0或颜色1。求其有多少联通子图,满足度数为1的节点颜色相同。
举个例子:
在这里插入图片描述

举个例子,比如!左子树有100种方案,中子树有200种方案,右子树有400种方案,试问总方案Ans是多少?这题答案应该是(Ans1+1)(Ans2+1)(Ans3+1)即101201301=6110601种。
解决方案:
一般要选择的方案是树形DP兼以DFS的运用一个DFS下去,顺便将DP也包办了。但题目中,要注意一点结果要与10^9+7求模,所以,应该边算边模。同时,鸟分雌雄,可以将鸟的雌雄理解为染色,即整张图只有0或1两种颜色。这使难度减小大大的。
至于具体做法我放在代码中,每一行都有注释。
参考公式:
d p x , c = ∏ s ∈ S o n x ( 1 + d p s , c ) dp_{x,c}=\prod_{s\in Son_x}(1+dp_{s,c}) dpx,c=sSonx(1+

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 给定一些文件夹和文件,要求将它们按照层级关系输出成一个树形结构。 输入格式: 输入的第一行包含一个整数 n,表示文件夹和文件的个数。 接下来 n 行,每行包含一个字符串,表示一个文件夹或者文件。 其中,文件名和文件夹名都不包含空格和斜杠,文件名包含一个小数点,表示文件后缀。 输出格式: 输出一个树形结构,每行表示一个文件夹或者文件,按照层级关系缩进,文件夹名称后面要加上一个斜杠。 注意,最后一个文件夹或者文件名称后面不能有空格。 样例: 输入: 6 /root /etc /root/abcd.txt /root/bcd/ /etc/test/ /root/bcd/efg.txt 输出: /root /abcd.txt /bcd/ /efg.txt /etc /test/ 算法1 (模拟) $O(n)$ 思路: 本题需要我们输出文件夹和文件的层级结构,因此可以考虑使用哈希表记录每个文件夹和文件的层级结构。 对于每个文件夹和文件,我们可以通过判断其路径中"/"的数量来确定其所在的层级结构,具体来说,每个"/"表示一层。因此,我们可以将路径按"/"分开,然后统计"/"的数量,就可以得到该文件夹或文件所在的层级结构。 同时,由于本题要求输出树形结构,因此我们需要对每个文件夹和文件进行缩进处理,使其在输出时具有层级关系。具体来说,我们可以通过其所在的层级结构来确定输出时需要添加的缩进空格数量。 最后,我们可以按照文件夹和文件的层级结构从小到大的顺序进行输出,这样能够保证每个文件夹和文件的父节点已经被输出过了。 时间复杂度 哈希表的查询和插入操作都是常数级别的,因此总时间复杂度为 $O(n)$。 C++ 代码 算法2 (模拟) $O(nlogn)$ 思路: 本题可以使用字典树来实现,具体来说,我们可以将每个文件夹和文件的路径看作一个字符串,然后将所有字符串插入到字典树中。 同时,我们可以定义一个结构体,用来存储每个字符串的层级结构和缩进空格数量,具体来说,每个字符串的层级结构可以通过其在字典树中的深度来确定,而每个字符串的缩进空格数量则可以通过其所在的层级结构来确定。 最后,我们可以按照字符串的层级结构从小到大的顺序进行输出,这样能够保证每个字符串的父节点已经被输出过了。 时间复杂度 插入字符串的时间复杂度为 $O(nlogn)$,输出字符串的时间复杂度也为 $O(nlogn)$,因此总时间复杂度为 $O(nlogn)$。 C++ 代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值