题意:

给定一棵nnn个节点的树,每个点有一个标志fff,f=1f = 1f=1表示该节点权值等于子节点中权值最大值,f=0f=0f=0表示该节点权值等于子节点权值中权值最小值。假如这棵树中有kkk个叶子节点,则可以对这kkk个叶子节点进行赋值,分别为1−k1-k1−k,不得重复。问根节点权值的最大值为多少。


思路:

这貌似是一个典型的树形DP问题,但是比赛的时候我还是没做出来,菜哭…

本题最直接的思路就是dp[x]dp[x]dp[x]表示节点xxx能够达到的最大值,但是很明显,这样定义的话不好转移,因为填的数是未知的。因此我们可以改为dp[x]=kdp[x]=kdp[x]=k表示节点xxx能够达到的xxx子树中叶子节点的第kkk大。这个定义式其实与一开始的差别不大,但是现在的定义更好转移。

如果xxx节点为叶子节点,显然dp[x]=1dp[x] = 1dp[x]=1。如果xxx节点取子节点的最大值,则dp[x]=min(dp[y])dp[x] = min(dp[y])dp[x]=min(dp[y]),yyy为xxx子节点。如果xxx节点取子节点最小值,则dp[x]=∑dp[y]dp[x]=\sum dp[y]dp[x]=∑dp[y],yyy为xxx的子节点。然后直接dpdpdp即可完成此题。


总结:

此题的主要特点就是dpdpdp定义式中表示的是一个比较的关系,不同于之前的具体数值,而是表示可选范围中的第kkk大。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 3*1e5+100;
const int M = 6*1e5+100;
const db EPS = 1e-9;
using namespace std;int n,head[N],tot,c[N],d[N],ans;
struct Edge{int to,next;
}e[M];void add(int x,int y){e[++tot].to = y, e[tot].next = head[x], head[x] = tot;
} void dfs(int x,int fa){int sum = 0, minn = 1e6;for(int i = head[x]; i; i = e[i].next){int y = e[i].to;if(y == fa) continue;dfs(y,x); sum += d[y], minn = min(minn,d[y]);}if(minn == 1e6) d[x] = 1, ans++;else if(c[x]) d[x] = minn;else d[x] = sum;
}int main()
{scanf("%d",&n); tot = 1;rep(i,1,n) scanf("%d",&c[i]);rep(i,2,n){int xx; scanf("%d",&xx);add(xx,i); add(i,xx);}dfs(1,-1);printf("%d\n",ans-d[1]+1);return 0;
}

【 Codeforces Round #551 (Div. 2) D】Serval and Rooted Tree【树形DP】相关推荐

  1. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  2. Codeforces Round #579 (Div. 3) F2. Complete the Projects (hard version) dp + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 排序方式跟easyeasyeasy版本的一样,但是hardhardhard版本是输出最多能选多少,所以我们对b<0b<0b<0的情况 ...

  3. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

    传送门 文章目录 题意: 思路: 题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起.再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了. 定义f[i]f[i ...

  4. Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,你需要将其分成若干组,每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−mi ...

  5. Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

    传送门 文章目录 题意: 思路: 题意: 思路: 首先我们知道如果所有数的和summodk!=0sum\bmod k!=0summodk!=0那么此时无解,否则我们设need=sum/kneed=su ...

  6. Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp

    传送门 文章目录 题意: 思路: 题意: 给你两个串s,ts,ts,t,每次都可以从sss的开头拿一个字符放到AAA串的开头或结尾,问最终有多少种方案使得ttt是AAA的前缀,注意sss不必全部拿完. ...

  7. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,包含a,b,c,?a,b,c,?a,b,c,?四种字符,其中???可以变成为a,b,ca,b,ca,b,c的任意一种,让你求abca ...

  8. Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造

    传送门 文章目录 题意: 思路: 题意: 给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd. n,d≤3000n,d\le 3000n,d≤3000. 思路: 先考虑不 ...

  9. Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp

    传送门 文章目录 题意: 思路: 题意: n≤1e5,m≤1e9,k≤8.n\le 1e5,m\le 1e9,k\le 8.n≤1e5,m≤1e9,k≤8. 思路: 注意到题目中保证了每个孩子至多收到 ...

  10. Codeforces Round #617 (Div. 3) E2. String Coloring (hard version) 思维 + dp + Dilworth定理

    传送门 文章目录 题意: 思路: 题意: 让你给一个串染色,不同颜色且相邻的一对字符可以互换位置,用最少的颜色,使交换后这个字符串字典序最小. 思路: 考虑将字符串分成若干个非递减的子序列,由于其非递 ...

最新文章

  1. UI设计师培训入门都需要学习什么技术?
  2. c语言查找功能的怎么使用方法,求C语言实现查询功能(如果选择3,如何实现查询)...
  3. iview标签页的点击方法_18页PPT:6个高手常用的自我介绍套路,很是得人心,学习...
  4. Node中的fs模块
  5. sqli-lab———writeup(11~17)
  6. socket中的几个数据结构
  7. win10 wsl和wsl2使用总结
  8. 自己编写DLL文件——注册——VB工程引用——标准EXE调用(含例子)
  9. 中国节能装备与产品市场“十四五”规划及2035年远景目标建议报2022-2028年
  10. python-opencv-使图片更清晰的几种方法
  11. 小程序毕业设计 基于微信鲜花花店商城小程序毕业设计开题报告功能参考
  12. Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)
  13. 计算机纳入高考作文,高考作文听人家说今年的高考作文是用计算机批 – 手机爱问...
  14. python如何根据数据画散点图_用python绘制散点图
  15. 四面体棱切球的一些特殊正弦定理及其几何性质
  16. Linux攻关之基础模块九 系统基本权限
  17. 【论文阅读】SISR综述:From Beginner to Master: A Survey for Deep Learning-based Single-Image Super-Resolution
  18. Python之urlparse模块
  19. SAP MM 物料主数据-物料版次-基础应用
  20. 网络推广-方法和技巧

热门文章

  1. Servlet技术详解
  2. Java设计person类,有姓名,年龄,性别。要求:该类至多只能创建一男,一女两个对象。
  3. 关于ping与tracert网络命令详解
  4. python os.path.splitext()的用法_Python中的os.path路径模块中的操作方法总结
  5. 最全计算机基础知识竞赛试题及答案,计算机基础知识竞赛试题.doc
  6. 【BZOJ2460】元素(线性基---(id,value)绑定,求id异或非0对应的最大value 和)
  7. 【浙江省第16届省赛E:】Sequence in the Pocket(思维--不模拟复杂过程)
  8. 【UVA725】Division(暴力求解--水题)
  9. 机器学习建模商务合作
  10. Python入门经典(2K超清)