题目链接: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)的更多相关文章

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

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

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

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

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

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

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

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

  5. cf 1241 E. Paint the Tree(DP)

    题意: 有一颗树,n个点,边有边权. 有无限多种颜色,每个点可以同时染上k种颜色,如果一条边的两个端点 拥有至少一种相同的颜色,那么说这条边是“饱和的”. 问:所有“饱和边”的权值和最大为多少,只需要 ...

  6. [CSP-S模拟测试]:tree(DP)

    题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...

  7. CF1153D Serval and Rooted Tree

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

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

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

  9. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

随机推荐

  1. Chrome(谷歌浏览器)和Firefox浏览器flash的swf文件发黑不透明问题解决方法

    一直以来看到各大网站的FLASH都是黑框框的,很好奇,难道他们不知道flash是可以设成透明的?于是用IE Tab插件浏览了下,发现人家的网页又正常,这样一来我就开始怀疑是我的Chrome有问题,于是 ...

  2. Jquery的一些基本操作

    /*获得TEXT.AREATEXT的值*/ var textval = $("#text_id").attr("value"); //或者 var textva ...

  3. ubuntu 使用sudo apt-get update命令的时候会报http://archive.ubuntukylin.com:10006/ubuntukylin/dists/xenial/InRelease 无法连接

    参考:  https://blog.csdn.net/xiaoyan94/article/details/52404539 于是找到一个包含 http://archive.ubuntukylin.co ...

  4. git 出现冲突时的解决办法

    <一> 二者兼得最麻烦 1, 出现冲突一般出现在群体开发两个及以上开发者同时修改同一个文件时 2, 具体表现为 git pull , git push 和 git commit 命令执行失 ...

  5. 通过Sonar的代码质量报告学习【如何写安全高质量的代码】

    1.不要用.size(),改用isEmpty() Using Collection.size() to test for emptiness works, but using Collection.i ...

  6. 集合,ArrayList

    用集合代替数组: Console.Write("请输入人数:"); int renshu = int.Parse(Console.ReadLine()); ArrayList ch ...

  7. spark 集成elasticsearch

    pyspark读写elasticsearch依赖elasticsearch-hadoop包,需要首先在这里下载,版本号可以通过自行修改url解决. """ write d ...

  8. 2018SDIBT_国庆个人第四场

    A - A  这题很巧妙啊,前两天刚好做过,而且就在博客里  Little C Loves 3 I time limit per test 1 second memory limit per test ...

  9. 用Hadoop AVRO进行大量小文件的处理(转)

    使用 使用使用 使用 HDFS 保存大量小文件的缺点:1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据.据统计,每一个文件需要消耗 NameNode600 字节内存.如果需要保 ...

  10. jquery Load方法的重要点

    一个非常重要而且很容易忽视的问题就是:你是否load进了你必须load的元素,是否有的没有load进来,打开firebug查看一下