CF-551-D-树dp/思维

时间:2023-03-09 09:50:26
CF-551-D-树dp/思维

http://codeforces.com/contest/1153/problem/D

    给出一颗有根树,叶子节点可以从1开始赋值但不能相同,每个节点有一个属性max/min表示选择所有儿子值中的max/min作为自己的值,问根节点最大值。

  考虑根的值如果是x,把>=x的值称为'1',反之称为'0',f[i]表示要想使得节点i为'1'的以i为根的子树中叶子节点为'1'的最小数量是多少。答案就是    |叶子节点|+1-f[1]。

  

 #include<bits/stdc++.h>
using namespace std;
#define LL long long const int maxn=+;
int in[maxn],op[maxn];
int res=,f[maxn];
vector<int>g[maxn];
void dfs(int u){
if(u!= && in[u]==){
f[u]=;
res++;
return;
}
if(op[u])f[u]=maxn;
else f[u]=;
for(auto v:g[u]){
dfs(v);
if(op[u]){
f[u]=min(f[u],f[v]);
}else{
f[u]+=f[v];
}
}
}
int main(){
int n,x;
cin>>n;
for(int i=;i<=n;++i)cin>>op[i];
for(int i=;i<=n;++i){
cin>>x;
in[x]++,in[i]++;
g[x].push_back(i);
}
dfs();
cout<<res+-f[]<<endl;
return ;
}