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)的更多相关文章

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

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

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

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

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

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

  4. CF1153D Serval and Rooted Tree

    题目地址:CF1153D Serval and Rooted Tree 挺好玩儿也挺考思维的一道题 思路:树形DP+贪心 数组 \(d\) 维护这样一个值: 对于一个节点 \(x\) ,它的值最大可以 ...

  5. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

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

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

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

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

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

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

  9. Contest 高数题 樹的點分治 樹形DP

    高数题 HJA最近在刷高数题,他遇到了这样一道高数题.这道高数题里面有一棵N个点的树,树上每个点有点权,每条边有颜色.一条路径的权值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻的 ...

随机推荐

  1. Spring学习(五)bean装配详解之 【XML方式配置】

    一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原则 最优先:通过隐式 Bean 的发现机制 ...

  2. MySQL中的find_in_set()函数使用技巧心得与应用场景总结

    Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 企业博客 CSDN.com 个人博 ...

  3. nginx 1.12 负载均衡配置

    负载均衡策略有以下几种: 请求轮询:round-robin,是默认策略,应用服务器的请求以循环方式分发,可以设置权重weight,默认权重均为1,因此每台后端服务器接受的请求数相同. 最少连接:lea ...

  4. 票房和口碑称霸国庆档,用 Python 爬取猫眼评论区看看电影《我和我的家乡》到底有多牛

    今年的国庆档电影市场的表现还是比较强势的,两名主力<我和我的家乡>和<姜子牙>起到了很好的带头作用. <姜子牙>首日破 2 亿,一举刷新由<哪吒之魔童降世&g ...

  5. 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值

    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...

  6. Java知识系统回顾整理01基础05控制流程03 while

    while和do-while循环语句 一.while:条件为true时 重复执行 只要while中的表达式成立,就会不断地循环执行 public class HelloWorld { public s ...

  7. 00 what is C Programming?C编程是什么?

    C语言简介 C is a programming language that lets us give a computer very specifio commands. C语言是一种编程语言,它让 ...

  8. 02 C语言最简单快速上手的IDE

    不要让开发环境 成为学习路上的拦路虎,先培养学习兴趣和学习路上的成就感,这个对于激励自己持续学习很重要. 等真正从小白入门了,甚至成为大牛了,能解决诸多困难问题了,安装个开发环境还会再是个什么难事吗? ...

  9. 编写自己的Arduino库

    参考及来源超给力啊: https://www.cnblogs.com/lulipro/p/6090407.html https://www.cnblogs.com/lulipro/p/6090407. ...

  10. 51单片机I2C总线

    I2C总线是飞利浦公司推出的一种串行总线,所有器件共用两根信号线,实现数据的传输. 总线接口接了上拉电阻,默认为高电平,所以就可以用"当低电平出现"来标记出一种起始信号.我个人把它 ...