【每日一题】11.黑白树 (树上DFS)
补题链接:Here
题目描述
一棵 \(n\) 个点的有根树,\(1\) 号点为根,相邻的两个节点之间的距离为 \(1\) 。树上每个节点 \(i\)对应一个值\(k[i]\)。每个点都有一个颜色,初始的时候所有点都是白色的。
你需要通过一系列操作使得最终每个点变成黑色。每次操作需要选择一个节点 \(i\) ,\(i\) 必须是白色的,然后 \(i\) 到根的链上(包括节点 \(i\) 与根)所有与节点 \(i\) 距离小于 \(k[i]\) 的点都会变黑,已经是黑的点保持为黑。问最少使用几次操作能把整棵树变黑。
输入描述:
第一行一个整数 \(n\) (\(1 ≤ n ≤ 10^5\) )
接下来 \(n-1\) 行,每行一个整数,依次为 \(2\) 号点到 \(n\) 号点父亲的编号。 最后一行 \(n\) 个整数为 \(k[i] (1 ≤ k[i] ≤ 10^5)\)
样例解释:
对节点 \(3\) 操作,导致节点 \(2\) 与节点 \(3\) 变黑
对节点 \(4\) 操作,导致节点\(4\) 变黑
对节点 \(1\) 操作,导致节点 \(1\) 变黑
输出描述:
一个数表示最少操作次数
示例1
输入
4
1
2
1
1 2 2 1
输出
3
Solution
由题意可知叶子节点必定要染色。对于其他节点:
- 若此节点的已经染色的子节点中,可以将它覆盖,那么不需要染色,并借助这个点能覆盖的范围更新最大范围。
- 若此节点的已经染色的子节点中,不能将它覆盖,那么需要将其子节点中范围最大的点染色,并更新最大范围。
可以发现这是一个由子节点向父节点更新的过程,所以可以使用 \(DFS\) 。每次贪心地更新能覆盖的最大距离,不能覆盖就进行染色。
- 时间复杂度:\(\mathcal{O}(n)\)
const int N = 1e5 + 10;
vector<int>e[N], k(N, 0), f(N, 0);
int ans = 0;
void dfs(int u, int fa) {
for (int i = 0; i < e[u].size(); ++i) {
int v = e[u][i];
dfs(v, u);
f[u] = max(f[u], f[v] - 1); //维护f值——儿子的f值-1之后的最大值
k[u] = max(k[u], k[v] - 1); //维护k值——儿子的k值-1和自己的k值的最大值
}
// cout << f[u] << " " << k[u] << "\n";
//下面的点都覆盖不到它了——选他自己,此时就要更新 f 值
if (f[u] == 0) ++ans, f[u] = k[u];
}
void solve() {
int n;
cin >> n;
for (int i = 2, x; i <= n; ++i) {
cin >> x;
e[x].push_back(i);
}
for (int i = 1; i <= n; ++i) cin >> k[i];
dfs(1, 0);
cout << ans;
}
如果深度理解这道题以后可以直接在solve里写DFS,此时运行速度会快很多 (60ms -> 18ms)
const int N = 1e5 + 10;
void solve() {
int n;
vector<int> p(N), k(N), f(N), g(N, 0);
cin >> n;
for (int i = 2; i <= n; ++i) cin >> p[i];
for (int i = 1; i <= n; ++i) cin >> k[i];
int ans = 0;
for (int i = n; i; --i) {
g[i] = max(g[i], k[i]);
if (f[i] == 0) ++ans, f[i] = g[i], g[i] = 0;
f[p[i]] = max(f[p[i]], f[i] - 1);
g[p[i]] = max(g[p[i]], g[i] - 1);
}
cout << ans << "\n";
}
【每日一题】11.黑白树 (树上DFS)的更多相关文章
- 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...
- CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...
- CISP/CISA 每日一题 11
CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...
- java面试每日一题11
题目:求1+2!+3!+...+20!的和 public class Recursion { public static void main(String args[]) throws NumberF ...
- 【js】Leetcode每日一题-叶子相似的树
[js]Leetcode每日一题-叶子相似的树 [题目描述] 请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 . 举个例子,如上图所示,给定一棵叶值序列为 (6, 7 ...
- uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心
#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- 【python】Leetcode每日一题-前缀树(Trie)
[python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...
- [每日一题2020.06.08]洛谷P1605 DFS
今天cf又杯具的只写出2题, 虽然AB题20分钟左右就搞定了, 但是CD写了2个小时也没写出来 D题我用到了DFS, 虽然必不正确, 但是我至少发现了一个问题, 那就是我连DFS都忘了, 于是怒找DF ...
- [BZOJ 3319] 黑白树
3319: 黑白树 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 557 Solved: 194[Submit][Status][Discuss] ...
随机推荐
- 使用 Guava Retry 优雅的实现重试机制
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 大家好,我是王有志.今天我会通过一个真实的项目改造案例和大家聊一聊如何优雅的实现 Java 中常用的的重 ...
- Azure - 机器学习企业级服务概述与介绍
Azure 机器学习 - 为端到端机器学习生命周期使用企业级 AI 服务. 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦 ...
- Springboot的Container Images,docker加springboot
Spring Boot应用程序可以使用Dockerfiles容器化,或者使用Cloud Native Buildpacks来创建优化的docker兼容的容器映像,您可以在任何地方运行. 1. Effi ...
- DFT与ATE IP TEST
IP的DFT设计测试与ATE IP TEST是一个设计,测试活动吗? 不是. 这两个设计对于前端工农村很容易搞混,认为是同一个人负责,同一个活动.实际情不是. DFT主要空DSC控制器对IP进行扫描, ...
- [ICPC2015WF] Tours
题目描述 The Arca Carania Mountain national park is opening up for tourist traffic. The national park ha ...
- TypeError: 'module' object is not callable (pytorch在进行MNIST数据集预览时出现的错误)
在使用pytorch在对MNIST数据集进行预览时,出现了TypeError: 'module' object is not callable的错误: 上报错信息图如下: 从图中可以看出,报错位置为第 ...
- python tkinter 使用(二)
python tkinter 使用(二) 本篇文章着重讲下tkinter中messagebox的使用. 1:提示框 def showinfo(event): messagebox.showinfo(& ...
- windows server 2019 IIS网站属性上没有asp.net标签 ,aspnet_regiis -i 不能安装用命令解决
用如下命令安装: dism /online /enable-feature /featurename:IIS-ASPNET45 /all
- servlet怎么实现第一个程序和实现下载文件
简单介绍一下servlet是什么:1:Servlet是sun公司提供的一门用于开发动态web资源的技术 2:我们若想用发一个动态web资源,需要完成以下2个步骤: 第一步:1.编写一个Java类,实现 ...
- redis的基本数据类型测试
依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...