题目链接: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. 4. Tomcat内存溢出解决

    1.  java.lang.OutOfMemoryError: PermGen space a.如果tomcat是以bat方式启动的,则如下设置: 修改TOMCAT_HOME/bin/catalina ...

  2. Linux 设置IP地址,并能连接外网

    1,如果是 centos6,请修改  vi /etc/sysconfig/network-scripts/ifcfg-eth0 2,如果是 centos7,请修改 => vi /etc/sysc ...

  3. centos7.5安装minikube kubernetes

    前提:已安装centos7.5安装VirtualBox Minikube是什么?Minikube是一种方便在本地运行Kubernetes的工具. Minikube 是可以在VM中运行单节点的Kuber ...

  4. CSS属性组-动画、转换、渐变

    一.动画 animation动画属性是一个简写属性,用于设置六个动画属性 aninmation-name动画名称,被调用 animation-duration完成动画需要的持续时间 animation ...

  5. LInux 阿里云系统遇到挖矿程序

    参考 https://blog.csdn.net/qq_37837029/article/details/82314428 重要的一点,移除下面文件里面的定时任务 /var/spool/cron/cr ...

  6. 06——react组件的基本定义和使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JS中Float类型加减乘除

    //浮点数加法运算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1]. ...

  8. Downloadftp

    #!/bin/bash FILENAME=$ DSTDIR=$ FTPSRV=ip FTPUSER="user" FTPPWD="password" SRCDI ...

  9. Jsp基本语法 第二节

    关于JSP的声明   即在JSP页面定义方法或者变量: <%!Java代码%> 在JSP页面中执行的表达式:<%=表达式%>   这个里尤其注意不能以:结束 JSP页面生命周期 ...

  10. c# vs2013部署项目

    http://demo.netfoucs.com/shinepan/article/details/24865931