2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (
2022-03-20:给定一棵多叉树的头节点head,
每个节点的颜色只会是0、1、2、3中的一种,
任何两个节点之间的都有路径,
如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径,
(a -> … -> b)和(b -> … -> a)算两条路径。
求多叉树上达标的路径一共有多少?
点的数量 <= 10^5。
答案2022-03-20:
方法一:自然智慧,所有节点两两对比。
方法二:递归,前缀和+后缀和+位运算。目前是最难的。
当前节点是起点,当前节点是终点。
子节点两两对比。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
root := NewNode(0)
root.nexts = make([]*Node, 2)
root.nexts[0] = NewNode(1)
root.nexts[1] = NewNode(2)
root.nexts[0].nexts = make([]*Node, 1)
root.nexts[0].nexts[0] = NewNode(3)
ret := colors3(root)
fmt.Println(ret)
}
type Node struct {
color int
nexts []*Node
}
func NewNode(c int) *Node {
ans := &Node{}
ans.color = c
ans.nexts = make([]*Node, 0)
return ans
}
type Info struct {
// 我这棵子树,总共合法的路径有多少?
all int
// 课上没有强调!但是请务必注意!
// 一定要从头节点出发的情况下!
// 一定要从头节点出发的情况下!
// 一定要从头节点出发的情况下!
// 走出来每种状态路径的条数
colors []int
}
func NewInfo() *Info {
ans := &Info{}
ans.all = 0
ans.colors = make([]int, 16)
return ans
}
func colors3(head *Node) int {
if head == nil {
return 0
}
return process3(head).all
}
var consider = [][]int{{}, // 0
{14, 15}, // 1 -> 0001
{13, 15}, // 2 -> 0010
{12, 13, 14, 15}, // 3 -> 0011
{11, 15}, // 4 -> 0100
{10, 11, 14, 15}, // 5 -> 0101
{9, 11, 13, 15}, // 6 -> 0110
{8, 9, 10, 11, 12, 13, 14, 15}, // 7 -> 0111
{7, 15}, // 8 -> 1000
{6, 7, 14, 15}, // 9 -> 1001
{5, 7, 13, 15}, // 10 -> 1010
{4, 5, 6, 7, 12, 13, 14, 15}, // 11 -> 1011
{3, 7, 11, 15}, // 12 -> 1100
{2, 3, 6, 7, 10, 11, 14, 15}, // 13 -> 1101
{1, 3, 5, 7, 9, 11, 13, 15}, // 14 -> 1110
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, // 15 -> 1111
}
func process3(h *Node) *Info {
ans := NewInfo()
hs := 1 << h.color
ans.colors[hs] = 1
if len(h.nexts) > 0 {
n := len(h.nexts)
infos := make([]*Info, n+1)
for i := 1; i <= n; i++ {
infos[i] = process3(h.nexts[i-1])
ans.all += infos[i].all
}
lefts := make([][]int, n+2)
for i := 0; i < n+2; i++ {
lefts[i] = make([]int, 16)
}
for i := 1; i <= n; i++ {
for status := 1; status < 16; status++ {
lefts[i][status] = lefts[i-1][status] + infos[i].colors[status]
}
}
rights := make([][]int, n+2)
for i := 0; i < n+2; i++ {
rights[i] = make([]int, 16)
}
for i := n; i >= 1; i-- {
for status := 1; status < 16; status++ {
rights[i][status] = rights[i+1][status] + infos[i].colors[status]
}
}
for status := 1; status < 16; status++ {
ans.colors[status|hs] += rights[1][status]
}
ans.all += ans.colors[15] << 1
for from := 1; from <= n; from++ {
for fromStatus := 1; fromStatus < 16; fromStatus++ {
for _, toStatus := range consider[fromStatus|hs] {
ans.all += infos[from].colors[fromStatus] * (lefts[from-1][toStatus] + rights[from+1][toStatus])
}
}
}
}
return ans
}
执行结果如下:

2022-03-20:给定一棵多叉树的头节点head, 每个节点的颜色只会是0、1、2、3中的一种, 任何两个节点之间的都有路径, 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径, (的更多相关文章
- 2022.02.20 SA
2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...
- hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。
/** 题目:hdu6003 Problem Buyer 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6003 题意:给定n个区间,以及m个数,求从n个区 ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 2021.03.20【NOIP提高B组】模拟 总结
区间 DP 专场:愉快爆炸 T1 题目大意 有 \(n\) 个有颜色的块,连续 \(k\) 个相同颜色的就可以消掉 现在可以在任意位置插入任意颜色的方块,问最少插入多少个可以全部抵消 题解 先把连续的 ...
- Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件)
Redis的哨兵机制中,如果是多哨兵模式,哨兵节点之间也是可以相互感知的,各种搜索之后出来的是千篇一律的一个基础配置文件,在配置当前哨兵节点的配置文件中,并没有配置其他哨兵节点的任何信息.如下是一个哨 ...
- 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】
POJ1741:Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29574 Accepted: 9915 Des ...
- [19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历
一.概念 java.io.File类:代表文件和目录. 在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. 以pathname为路径创建File对象,如果pathname是相对路 ...
- PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径
总结: 1. include或require包含其他文件 使用./或者 ../,这里的当前路径和上一层路径,取决于运行脚本的路径,会存在如下问题. 在写PHP程序时,经常要用到include或requ ...
- 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块
Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...
随机推荐
- webpack之webpack和vite的区别
打包原理 缺点 其他特点 webpack 解析各个模块的依赖关系 使用loader转换文件,使用plugin注入钩子,打包合并模块,最终生成bundle文件,使用express开启本地服务器, 浏 ...
- 查看服务器cpu 核心数
cpu相关信息所在文件是 /proc/cpuinfo 物理cpu数 # grep "physical id" /proc/cpuinfo | sort | uniq | wc -l ...
- git rebase时出现的提示信息
root@host: /home/wkxnk/project$ git rebase master First, rewinding head to replay your work on top ...
- laravel whereHas sum & addSelect sum
$users = User::select('id', 'username', 'coins', 'cut') ->when(request()->has('agent_tip_sum') ...
- 如何使用Github创建一个仓库
创建仓库(对我来说,这是新建) 点击这里的Create repository: 进入到这样一个界面: 其中,Repository name,是我们即将创建完成的仓库名称: 而这里: 需要填写的是对仓库 ...
- 11.3 shtctl的指定省略(harib08c)
ps:能力有限,若有错误及纰漏欢迎指正.交流 11.3 shtctl的指定省略(harib08c) 对bootpack.h做了如下改动 struct SHEET { unsigned char *bu ...
- webpack原理(1):Webpack热更新实现原理代码分析
热更新,主要就是把前端工程 文件变更,即时编译,然后通知到浏览器端,刷新代码. 服务单与客户端通信方式有:ajax 轮询,EventSource.websockt. 客户端刷新一般分为两种: 整体页面 ...
- 使用 DeepSpeed 和 Hugging Face 🤗 Transformer 微调 FLAN-T5 XL/XXL
Scaling Instruction-Finetuned Language Models 论文发布了 FLAN-T5 模型,它是 T5 模型的增强版.FLAN-T5 由很多各种各样的任务微调而得,因 ...
- GO实现Redis:GO实现TCP服务器(1)
本文实现一个Echo TCP Server interface/tcp/Handler.go type Handler interface { Handle(ctx context.Context, ...
- 利用复杂数据类型(eg:对象)时,是直接调用属性快,还是先用变量填装使用快
为了验证,我用时间戳去尝试 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ch ...