cf-Round551-Div2-D. Serval and Rooted Tree(DP)
题目链接:https://codeforces.com/contest/1153/problem/D
题意:有一棵树,给定结点数n,在每个结点上的操作(max:表示该结点的number为其孩子结点中的最大值,min相反),结点2..n的父结点。叶子结点上定义的操作可忽略,叶子结点的number为1..num,且互不相同,num为叶子结点个数,求根节点的number的最大值。
思路:被这道题虐了大半天,加上还没找到详细易懂的题解,所以做了这么久,不过弄懂之后还是觉得很值得哈哈。先用vector数组存储每个结点的子节点,用dp[i]表示结点i的最大number是其所有叶子结点中的第dp[i]大的,并且dp[j]=1(j为所有叶子结点的编号)。然后对于非叶子结点,若其操作为max,dp[i]=min(dp[j])(j为i的直接孩子结点,因为求最大值,故是第x大中的x越小越好);若操作为min,则dp[i]=sum(dp[j])(j为i的直接孩子结点),最终答案为num+1-dp[1](num为叶子结点个数)。举个例子:

图中的方括号内的数字是其number大小。则dp[4]=dp[8]+dp[9]=2,其实际意义是很明显的,结点4是结点8和结点9中最小的,也就是结点4是其所有叶子孩子结点(结点8、9)中第二大的。dp[2]=min(dp[4],dp[5])=dp[5]=1,也就是结点2是其所有叶子孩子结点(结点5、8、9)中第1大的。dp[3]=sum(dp[6],dp[7])=2,也就是结点3是其所有直接叶子结点(结点6,7)中第二大的。dp[1]=min(dp[2],dp[3])=dp[2]=1,也就是结点1是其所有叶子结点(结点5、6、7、8、9)中第一大的。记num为所有叶子结点的个数,本题num=5,则最终答案为num+1-dp[1]=5-1+1=5。
AC代码:
#include<bits/stdc++.h>
using namespace std; inline int read(){
int x=,f=;char c=;
while(!isdigit(c)){f|=c=='-';c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
} const int maxn=;
int n,op[maxn],dp[maxn],num;
vector<int> v[maxn]; void dfs(int p){
if(p>&&v[p].empty()){
dp[p]=,++num;
return;
}
if(op[p]) dp[p]=0x3f3f3f3f;
else dp[p]=;
for(int i=;i<v[p].size();++i){
dfs(v[p][i]);
if(op[p]) dp[p]=min(dp[p],dp[v[p][i]]);
else dp[p]+=dp[v[p][i]];
}
} int main(){
n=read();
for(int i=;i<=n;++i)
op[i]=read();
for(int i=;i<=n;++i){
int tmp=read();
v[tmp].push_back(i);
}
dfs();
printf("%d\n",num+-dp[]);
return ;
}
cf-Round551-Div2-D. Serval and Rooted Tree(DP)的更多相关文章
- CF1153D Serval and Rooted Tree(树形DP)
题目链接: https://www.luogu.org/problemnew/show/CF1153D (cf崩了,贴了个落谷的) 题目大意:给你n个点,然后n-1条边,构成一棵树,每个点是子节点 ...
- CF 551 D.Serval and Rooted Tree 树形DP
传送门:http://codeforces.com/contest/1153/problem/D 思路: 这道题想了一天,突发奇想,就是维护每个点两个值,第几大和第几小,就可以有传递性了. #incl ...
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ...
- cf 1241 E. Paint the Tree(DP)
题意: 有一颗树,n个点,边有边权. 有无限多种颜色,每个点可以同时染上k种颜色,如果一条边的两个端点 拥有至少一种相同的颜色,那么说这条边是“饱和的”. 问:所有“饱和边”的权值和最大为多少,只需要 ...
- [CSP-S模拟测试]:tree(DP)
题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...
- CF1153D Serval and Rooted Tree
题目地址:CF1153D Serval and Rooted Tree 挺好玩儿也挺考思维的一道题 思路:树形DP+贪心 数组 \(d\) 维护这样一个值: 对于一个节点 \(x\) ,它的值最大可以 ...
- D. Serval and Rooted Tree (樹狀DP)
Codeforce 1153D Serval and Rooted Tree (樹狀DP) 今天我們來看看CF1153D 題目連結 題目 給一棵數,假設有$k$個葉節點,我們可以給葉節點分配$1$~$ ...
- Device Tree(三):代码分析【转】
转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...
随机推荐
- 序列化 (实现RPC的基础)
public interface ISerializer { <T> byte[] serializer(T obj); <T> T deSerializer(byte[] d ...
- Python基础2 列表 字典 集合
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- 白鹭引擎 - 事件机制 ( Event, addEventListener, dispatchEvent )
1, 自定义事件, MyEvent class MyEvent extends egret.Event { /** * 一般会定义一个 DATA 字段作为事件 * 绑定事件监听器时, 一般用 类.DA ...
- 没有cv2.so文件
最近发现opencv安装的有问题,发现少了cv2.so文件,这个文件是给python的调度包. 查来查去,发现cmake的时候有这个: -- Found PythonInterp: /usr/bin/ ...
- JS与Android交互
一.Android调用JS 2种方法 1.通过WebView的loadUrl 2.通过WebView的evaluateJavascript
- SVM视频跟踪
# -*- coding: utf-8 -*- """ Created on Thu Nov 8 21:44:12 2018 @author: xg "&quo ...
- UI5-学习篇-3-Local SAP WEB IDE下载
1.下载地址 https://tools.hana.ondemand.com/#sapui5 有两个版本,针对各自系统环境选择对应的个人版本下载后解压. 个人版:个人试用 生产版:在云平台SCP付费订 ...
- class 方法
实例对象调用class方法时返回这个实例对象的isa指针,也就是对应的类对象: 类对象调用class方法时返回这个类对象本身. (注:如果想一直获得一个类的类对象,也就是isa指针,可以调用runti ...
- html _ 提取html片段内的纯文本
var html = “html字符串”;var textstr =html.replace(/<[^>]*>|/g,"");//纯文本
- Slava and tanks 877C
C. Slava and tanks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...