题解 CF1153D 【Serval and Rooted Tree】
题目大意
给定一个有
操作类型
假设这棵树有
解题思路
假设答案为
按照上面的操作,如果我们到达了一个叶子结点,那么我们就需要一个大于等于
我们发现在这个过程中唯一能控制到达叶子结点数的是操作类型
在操作
最后,我们发现根节点能选择的最小叶子结点数
代码展示
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=600010;
int n,op[maxn],x,k;
int cur,h[maxn],nxt[maxn],p[maxn];
int f[maxn];
void add_edge(int x,int y)
{
cur++;
nxt[cur]=h[x];
h[x]=cur;
p[cur]=y;
}
void dfs(int x,int fa)
{
int ch=0;
if(op[x]==1)f[x]=2e9;
for(int j=h[x];j;j=nxt[j])if(p[j]!=fa)
{
ch++;
dfs(p[j],x);
if(op[x]==0)f[x]+=f[p[j]];
else f[x]=min(f[x],f[p[j]]);
}
if(!ch)k++,f[x]=1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",op+i);
for(int i=2;i<=n;i++)scanf("%d",&x),add_edge(i,x),add_edge(x,i);
dfs(1,-1);
printf("%d\n",k+1-f[1]);
return 0;
}