#define HAVE_STRUCT_TIMESPEC
#include <bits/stdc++.h>
using namespace std;
int val[300007],num[300007],ans=0;
vector<int>v[300007];
void dfs(int u){
if(v[u].size()==0){
num[u]=1;
ans++;
return;
}
int tmp=0;
for(int i=0;i<v[u].size();i++){
int vv=v[u][i];
dfs(vv);
tmp+=num[vv];//u所有子树的所有叶子节点个数
if(val[u]==1)
num[u]=min(num[u],num[vv]);//如果是max的话,要使传递到根节点的叶子个数最少,只需要选某颗子树中最少的叶子个数
else
num[u]=max(num[u],tmp);//如果是min的话,别无选择,只能选子树中叶子节点最多的值
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>val[i];
if(val[i]==1)
num[i]=1e9;
else
num[i]=0;
}
for(int i=2;i<=n;i++){
int u;
cin>>u;
v[u].push_back(i);
}
dfs(1);
cout<<ans-num[1]+1;
}

/* 另一种较快的代码,本质思路相同

#include<bits/stdc++.h>
using namespace std;
int col[300007];
int dp[300007];
int a[300007];
int head[300007];
int nex[600007];
int to[600007];
int f[300007];
int du[300007];
void dfs(int u,int fa){
if(col[u])
dp[u]=1;
if(a[u]==0){
for(int i=head[u];i;i=nex[i]){
int v=to[i];
if(v==fa)
continue ;
dfs(v,u);
dp[u]+=dp[v];
}
}
else if(!col[u]){
int z=1e9;
for(int i=head[u];i;i=nex[i]){
int v=to[i];
if(v==fa)
continue ;
dfs(v,u);
z=min(z,dp[v]);
}
dp[u]=z;
}
}
int tot;
void add(int u,int v){
nex[++tot]=head[u];//上一条边
head[u]=tot;//最后一条边
to[tot]=v;//连向的点
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=2;i<=n;++i){
scanf("%d",&f[i]);
add(f[i],i);
add(i,f[i]);
du[i]++;
du[f[i]]++;
}
int ans=0;
for(int i=2;i<=n;++i){
if(du[i]==1)
col[i]=1,ans++;
}
dfs(1,0);
printf("%d",ans-dp[1]+1);
return 0;
}*/

Codeforces Round #551 (Div. 2)D(树形DP)的更多相关文章

  1. Codeforces Round #551 (Div. 2) D 树形dp

    https://codeforces.com/contest/1153/problem/D 题意 一颗有n个点的数,每个点a[i]为0代表取子节点的最小,1代表取最大,然后假设树上存在k个叶子,问你如 ...

  2. Codeforces Round #530 (Div. 2) F (树形dp+线段树)

    F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...

  3. 【Codeforces】Codeforces Round #551 (Div. 2)

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

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

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

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

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

  6. Codeforces Round #551 (Div. 2) A-E

    A. Serval and Bus 算出每辆车会在什么时候上车, 取min即可 #include<cstdio> #include<algorithm> #include< ...

  7. AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)

    B. Recover the String 大意: 求构造01字符串使得子序列00,01,10,11的个数恰好为$a_{00},a_{01},a_{10},a_{11}$ 挺简单的构造, 注意到可以通 ...

  8. Educational Codeforces Round 67 E.Tree Painting (树形dp)

    题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...

  9. Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)

    yyb大佬的博客 这线段期望好神啊... 还有O(nlogn)FFTO(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客 本蒟蒻只会O(n2)O(n^2)O(n2) CODE ...

随机推荐

  1. 手机CPU那些事

    原文:https://zhuanlan.zhihu.com/p/19923974 如今人们买手机,都比较关心采用了什么 CPU,因为 CPU 直接决定了这台手机的性能,CPU 之于手机 就好比人的大脑 ...

  2. WEB - 关于rel="noopener"

    参考网址 https://mathiasbynens.github.io/rel-noopener/ 例子 <a href="https://cli.vuejs.org" t ...

  3. 关于php/js抓取/采集

    前段时间用php的一个插件(phpQuery+queryList)写了采集某个博客的一些博文,然后用linux的自动运行跑,感觉还不错. 但在很久之前就已经听说了另外一个插件,可以很好的进行采集,叫做 ...

  4. watch监听变化

    <template> <div> 父级 <childCom1 @click.native="fn()"></childCom1> { ...

  5. 吴裕雄 python 神经网络——TensorFlow 循环神经网络处理MNIST手写数字数据集

    #加载TF并导入数据集 import tensorflow as tf from tensorflow.contrib import rnn from tensorflow.examples.tuto ...

  6. ZOJ - 3203 Light Bulb(三分)

    题意:灯离地面的高度为$H$,人的身高为$h$,灯离墙的距离为$D$,人站在不同位置,影子的长度不一样,求出影子的最长长度. 思路:设人离灯的距离为$x$,当人走到距离灯长度为$L$时,人在墙上的影子 ...

  7. VMware升级到15版本虚拟机黑屏的解决方法

    1.启动VMware15虚拟机,在菜单栏找到:虚拟机→管理→更改硬件兼容性 2.打开该项,弹出更改硬件兼容性向导对话框,点  下一步,接下来把硬件兼容性改为Workstation 12.x 3.根据提 ...

  8. js 判断回文字符串

    回文字符串:字符串从前往后读和从后往前读字符顺序是一致的. 判断一个字符串是不是回文字符串 function isPalindrome(str) { var str1 = str.split(''). ...

  9. Java入门笔记 08-注解

    1. 注解:通过 @interface 关键字进行定义2. 元注解:是一种基本注解,但是它能够应用到其它的注解上面.@Retention:解释说明了这个注解的的存活时间.取值如下: Retention ...

  10. 4_4 信息解码(UVa213)<二进制:输入技巧与调试技巧>

    消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. 你的程序的编码方案的核心是一个序列的“0和1” ...