题目地址:CF1153D Serval and Rooted Tree

挺好玩儿也挺考思维的一道题

思路:树形DP+贪心

数组 \(d\) 维护这样一个值:

对于一个节点 \(x\) ,它的值最大可以为以 \(x\) 为根的子树中叶子节点的数值中排名第 \(d_x\) 大的数值

感性的理解就是,假如这个节点下有 \(n\) 个叶子节点,儿这个节点的 \(d\) 值为 \(k\) ,那么这个节点最大可以是 \(n+1-k\) 。

假设现在在节点 \(x\) :

如果 \(x\) 是叶子节点,那么 \(d_x = 1\) ;

如果 \(x\) 是 \(min\) 节点,那么 \(d_x = \sum_{y \in son_x}\ d_y\) ;

如果 \(x\) 是 \(max\) 节点,那么 \(d_x = min_{y \in son_x}\ d_y\) 。

那么显然 \(ans = cnt + 1 - d_1\) ,其中 \(cnt\) 为叶子节点个数。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 3e5 + 6;
  4. int n, a[N], d[N], cnt;
  5. vector<int> e[N];
  6. void dfs(int x) {
  7. if (!e[x].size()) {
  8. d[x] = 1;
  9. ++cnt;
  10. return;
  11. }
  12. d[x] = a[x] ? n : 0;
  13. for (unsigned int i = 0; i < e[x].size(); i++) {
  14. int y = e[x][i];
  15. dfs(y);
  16. if (a[x]) d[x] = min(d[x], d[y]);
  17. else d[x] += d[y];
  18. }
  19. }
  20. int main() {
  21. cin >> n;
  22. for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  23. for (int i = 2, f; i <= n; i++) {
  24. scanf("%d", &f);
  25. e[f].push_back(i);
  26. }
  27. dfs(1);
  28. cout << cnt + 1 - d[1] << endl;
  29. return 0;
  30. }

CF1153D Serval and Rooted Tree的更多相关文章

  1. CF1153D Serval and Rooted Tree(树形DP)

      题目链接: https://www.luogu.org/problemnew/show/CF1153D (cf崩了,贴了个落谷的) 题目大意:给你n个点,然后n-1条边,构成一棵树,每个点是子节点 ...

  2. D. Serval and Rooted Tree (樹狀DP)

    Codeforce 1153D Serval and Rooted Tree (樹狀DP) 今天我們來看看CF1153D 題目連結 題目 給一棵數,假設有$k$個葉節點,我們可以給葉節點分配$1$~$ ...

  3. Codeforces 1153D Serval and Rooted Tree (简单树形DP)

    <题目链接> 题目大意: Serval拥有的有根树有n个节点,节点1是根. Serval会将一些数字写入树的所有节点.但是,有一些限制.除叶子之外的每个节点都有一个写入操作的最大值或最小值 ...

  4. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...

  5. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ...

  6. cf-Round551-Div2-D. Serval and Rooted Tree(DP)

    题目链接:https://codeforces.com/contest/1153/problem/D 题意:有一棵树,给定结点数n,在每个结点上的操作(max:表示该结点的number为其孩子结点中的 ...

  7. CF 551 D.Serval and Rooted Tree 树形DP

    传送门:http://codeforces.com/contest/1153/problem/D 思路: 这道题想了一天,突发奇想,就是维护每个点两个值,第几大和第几小,就可以有传递性了. #incl ...

  8. hdu 1232, disjoint set, linked list vs. rooted tree, a minor but substantial optimization for path c 分类: hdoj 2015-07-16 17:13 116人阅读 评论(0) 收藏

    three version are provided. disjoint set, linked list version with weighted-union heuristic, rooted ...

  9. 【Codeforces】Codeforces Round #551 (Div. 2)

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

随机推荐

  1. Django-admin管理工具

    知识预览 admin组件使用 admin源码解析 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目 ...

  2. 微信h5支付

    分为 微信内H5调起支付 和 非微信浏览器H5支付. 1.H5支付(微信内) 参考链接:https://www.jianshu.com/p/6b9acdd10de6 2.JSAPI支付(非微信) 参考 ...

  3. iview 将table的selection多选变单选方法

    相信很多使用iview的朋友,在用到table,都会遇到需要使用selection的场景,但是总会有那么一个产品汪,觉得iview的单选效果不好,非要用selection的来做单选,那么下面这个方法就 ...

  4. CentOS_7下安装Nginx服务

    安装make: yum -y install gcc automake autoconf libtool make make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过 ...

  5. Python_001_开始学习的一些准备

    从Hello World!开始,希望你能坚持一下,然后每一天有一点收获. ♥   安装了pip和setuotools库: pip用于安装管理Python扩展包,setuptools用于分布Python ...

  6. 自动化测试框架【windows版】:JMeter + Ant + Jenkins

    前提条件:windows安装了jmeter.ant.jenkins 安装方法参考汇总目录中对应的博文 截图看不清的,可以调大浏览器倍数看 jenkins驱动ant执行,ant驱动jmeter执行 an ...

  7. HF-01

    胡凡 本书在第2章对C语言的语法进行了详细的入门讲解,并在其中融入了部分C+的特性. 第3-5章是 入门部分. 第3章 初步训练读者最基本的编写代码能力: 第4章对 常用介绍,内容重要: 第5章是   ...

  8. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

  9. LOJ#2665 树的计数

    题意:给你DFS序和BFS序,求树的期望高度. 解:先分析性质. 考虑到BFS序是分层的,DFS序的子树是一段,那么我们遍历BFS序并在DFS序上标记对应点的话,就会发现BFS序每一层都会把若干棵子树 ...

  10. ubuntu16.04安装中文输入法

    https://blog.csdn.net/u011795345/article/details/53041707