D. Serval and Rooted Tree (樹狀DP)
Codeforce 1153D Serval and Rooted Tree (樹狀DP)
今天我們來看看CF1153D
題目連結
題目
給一棵數,假設有$k$個葉節點,我們可以給葉節點分配$1$~$k$這些數字,當做這些節點的"值"。
每個非葉節點的點(不妨令為點$u$)的值有可能是所有$u$的子節點的$\min$或$\max$。
令根節點為節點$1$,求根節點可能的最大值。
想法
首先有可能想到要做樹狀dp,而每個點的狀態就是:「假設點$u$為根的子樹有$k_u$個葉節點,$dp[u]$為$1$~$k_u$中的最大可能(如果我們給這$k_u$個葉節點分配$1$~$k_u$的值)」。
如果點$u$為$\min$,那麼我們只要找出$u$的子節點中$dp$值最小的就好。但是如果點$u$為$\max$,那麼要得到$dp[u]$,我們只需要在『「$dp$值最大的$u$的子節點(令為$v$)」的子樹的葉節點』中分配$k_u$中最大的$k_v$個即可。
但是如果這樣做,我們會需要維護每一個節點的子樹總共有多少個葉節點。因此我們不妨把$dp$陣列儲存的東西改為:$dp[u]$為$k_u-$(\(1\)~$k_u$中的最大可能)+1,也就是這次是從$k_u$開始往$1$數,看最大值為第幾個數到的。
如此一來,$dp$轉移式即可改為:
$\begin
dp[u]=\min{dp[v]}{v\in son(u)}\ \text\
dp[u]=\sum{v\in son(u)} dp[v]\ \text
\end$
而最終的答案即為$k-dp[1]+1$
程式碼:
const int _n=3e5+10;
int t,n,s[_n],dpT[_n],k;
VI G[_n];
int dp(int v){
  if(dpT[v])return dpT[v];
  if(SZ(G[v])==0){k++;return dpT[v]=1;}
  if(s[v]==1){dpT[v]=dp(G[v][0]);rep(i,1,SZ(G[v]))dpT[v]=min(dpT[v],dp(G[v][i]));}
  if(s[v]==0)rep(i,0,SZ(G[v]))dpT[v]+=dp(G[v][i]);
  return dpT[v];
}
main(void) {cin.tie(0);ios_base::sync_with_stdio(0);
  cin>>n;rep(i,1,n+1)cin>>s[i];
  rep(i,2,n+1){cin>>t;G[t].pb(i);}
  dp(1);cout<<k-dp(1)+1<<'\n';
  return 0;
}
標頭、模板請點Submission看
Submission
D. Serval and Rooted Tree (樹狀DP)的更多相关文章
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
		题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ... 
- Codeforces 1153D Serval and Rooted Tree (简单树形DP)
		<题目链接> 题目大意: Serval拥有的有根树有n个节点,节点1是根. Serval会将一些数字写入树的所有节点.但是,有一些限制.除叶子之外的每个节点都有一个写入操作的最大值或最小值 ... 
- CF1153D Serval and Rooted Tree(树形DP)
		题目链接: https://www.luogu.org/problemnew/show/CF1153D (cf崩了,贴了个落谷的) 题目大意:给你n个点,然后n-1条边,构成一棵树,每个点是子节点 ... 
- CF1153D Serval and Rooted Tree
		题目地址:CF1153D Serval and Rooted Tree 挺好玩儿也挺考思维的一道题 思路:树形DP+贪心 数组 \(d\) 维护这样一个值: 对于一个节点 \(x\) ,它的值最大可以 ... 
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
		Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ... 
- Codeforces Round #551 (Div. 2)  D. Serval and Rooted Tree  (树形dp)
		题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ... 
- cf-Round551-Div2-D. Serval and Rooted Tree(DP)
		题目链接:https://codeforces.com/contest/1153/problem/D 题意:有一棵树,给定结点数n,在每个结点上的操作(max:表示该结点的number为其孩子结点中的 ... 
- CF 551 D.Serval and Rooted Tree 树形DP
		传送门:http://codeforces.com/contest/1153/problem/D 思路: 这道题想了一天,突发奇想,就是维护每个点两个值,第几大和第几小,就可以有传递性了. #incl ... 
- Contest 高数题 樹的點分治 樹形DP
		高数题 HJA最近在刷高数题,他遇到了这样一道高数题.这道高数题里面有一棵N个点的树,树上每个点有点权,每条边有颜色.一条路径的权值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻的 ... 
随机推荐
- PHP代码审计01之in_array()函数缺陷
			前言 从今天起,结合红日安全写的文章,开始学习代码审计,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会再用一道有相同问题的CTF题来进行巩固.下面开始分析. 漏洞分析 ... 
- iOS14 debug安装的带有flutter应用从桌面图标重新启动时闪退
			刚刚升级遇到的问题,希望能够帮助到遇到相同问题的人. 用xcode12连接iOS设备调试安装应用 拔掉数据线 从桌面图标点击进入App必闪退 后来发现是flutter的原因,目前有下面两种个解决方案: ... 
- 【性能监控-Perfmon工具】Perfmon工具使用教程
			一.Perfmon工具简介 Perfmon是一款Windows自带的性能监控工具,提供了图表化的系统性能实时监视器.性能日志和警报管理.通过添加性能计数器可以实现对CPU.内存.网络.磁盘.进程等多类 ... 
- PyCharm-缩进 格式化代码
			格式化代码 Ctrl + Alt + l 缩进代码 Tab 向右缩进4格 Shift + Tab 向左缩进4格 
- 04 sublime text 3在线安装package control插件,之后安装主题插件和ConvertToUTF8  插件
			前提:需要@@科学@@上网 在线安装包通常都需要@@科学@@上网 安装package control插件 在线安装package control插件 按ctrl+shift+p 输入install,选 ... 
- VSCode搭建golang环境
			安装对应版本的Golang 略 VSCode安装对应 Go 插件 在应用商店安装即可:go VSCode安装 Go 工具: 在VSCode输入:Crtl + Shift + P 在弹出框输入:inst ... 
- 用React 中的useState改变值不重新渲染的问题
			不渲染 const [lists,setLists] =useState([]); ..... const arr = lists; arr.splice(index,1) //根据删除index下标 ... 
- c#之task与thread区别及其使用
			如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ... 
- js 基础概念
			一 执行上下文 和 执行上下文栈 执行上下文:一段javascript代码执行前的准备工作 问题一:js引擎遇到怎样一段代码才会做"准备工作呢"? 可执行代码类型:全局代码.函数代 ... 
- rxjs入门4之rxjs模式设计
			观察者模式 (Observer Pattern) 观察者模式其实在日常编码中经常遇到,比如DOM的事件监听,代码如下 function clickHandler(event) { console.lo ... 
