#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. +(new Date())

    +(new Date()) 等于 new Date().getTime();展示 1561003191879 毫秒时间戳

  2. 计算机二级-C语言-程序修改题-190108记录-字符串处理

    //程序修改题:给定程序MODI1.C中函数fun的功能是:先将字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面.例如:当s中的字符串为:“ABCDE”时,则t中的字符串应为 ...

  3. CSS - div居中在屏幕中(水平居中 + 垂直居中)

    方法一代码 <div> <h1>404 Not Found.</h1> </div> <style> div { text-align: c ...

  4. mysql成功的远程连接

    1.在虚拟机上的window7中安装mysql,版本mysql-5.7.27-win32,可以是解压版或者是安装版的, MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi ...

  5. 微信公众平台接口获取时间戳为10位,java开发需转为13位

    问题1:为什么会生成13位的时间戳,13位的时间戳和10时间戳分别是怎么来的 ? java的date默认精度是毫秒,也就是说生成的时间戳就是13位的,而像c++或者php生成的时间戳默认就是10位的, ...

  6. cglib用法

    CGLib动态代理的介绍及用法(单回调.多回调.不处理.固定值.懒加载) 参照: https://blog.csdn.net/difffate/article/details/70552056 前面介 ...

  7. python opencv:使用滑动条做调色板

    cv2.getTrackbarPos() 函数的 一个参数是滑动条的名字, 第二个参数是滑动条被放置窗口的名字, 第三个参数是滑动条的默认位置. 第四个参数是滑动条的最大值, 第五个函数是回调函数,每 ...

  8. 计划任务cron,date,时间同步ntp,chrony

    取出磁盘利用率最大值 ,写个脚本,做判断,只要快满了,就报警 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业  /etc/crontab 用户cron任务: ...

  9. opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)

    未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...

  10. msbuild发布web应用程序

    aspnet_compiler.exe 只能编译 网站,web应用程序项目使用下面的命令即可. msbuild C:\Jenkins\jobs\KM_ERP_WEBAPP\workspace\KMWe ...