D. Serval and Rooted Tree
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Now Serval is a junior high school student in Japari Middle School, and he is still thrilled on math as before.
As a talented boy in mathematics, he likes to play with numbers. This time, he wants to play with numbers on a rooted tree.
A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. A parent of a node vv is the last different from vvvertex on the path from the root to the vertex vv. Children of vertex vv are all nodes for which vv is the parent. A vertex is a leaf if it has no children.
The rooted tree Serval owns has nn nodes, node 11 is the root. Serval will write some numbers into all nodes of the tree. However, there are some restrictions. Each of the nodes except leaves has an operation maxmax or minmin written in it, indicating that the number in this node should be equal to the maximum or minimum of all the numbers in its sons, respectively.
Assume that there are kk leaves in the tree. Serval wants to put integers 1,2,…,k1,2,…,k to the kk leaves (each number should be used exactly once). He loves large numbers, so he wants to maximize the number in the root. As his best friend, can you help him?
Input
The first line contains an integer nn (2≤n≤3⋅1052≤n≤3⋅105), the size of the tree.
The second line contains nn integers, the ii-th of them represents the operation in the node ii. 00 represents minmin and 11 represents maxmax. If the node is a leaf, there is still a number of 00 or 11, but you can ignore it.
The third line contains n−1n−1 integers f2,f3,…,fnf2,f3,…,fn (1≤fi≤i−11≤fi≤i−1), where fifi represents the parent of the node ii.
Output
Output one integer — the maximum possible number in the root of the tree.
Examples
input
Copy
6 1 0 1 1 0 1 1 2 2 2 2
output
Copy
1
input
Copy
5 1 0 1 0 1 1 1 1 1
output
Copy
4
input
Copy
8 1 0 0 1 0 1 1 0 1 1 2 2 3 3 3
output
Copy
4
input
Copy
9 1 1 0 0 1 0 1 0 1 1 1 2 2 3 3 4 4
output
Copy
5
题目大意:给出一个有根树,每个节点为1,或者0,1代表取所有子节点的最大值,0代表取所有子节点的最小值。
我们可以随意给叶子节点赋值,问根节点最大的值是多少。
解题思路:
我们以dp[i]j记录以i为根能够得到第k大的值最小为多少(倒序)。
1.如果当前节点为min 则当前能够传上去的是第(叶子节点数)大的
2.如果当前节点为max节点则取子节点的最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<map>
using namespace std;
#define LL long long
#define N 300005
#define maxn 1000005
#define inf 0x3f3f3f3f
#define sca(x) scanf("%d",&x)
#define pb(x) push_back(x)
vector<int>V[N];
int dp[N],a[N];
int cnt;
void dfs(int u)
{
if(!V[u].size())
{
dp[u]=1;
cnt++;
return ;
}
if(a[u])dp[u]=inf;
else dp[u]=0;
for(auto i:V[u])
{
dfs(i);
if(a[u]) dp[u]=min(dp[u],dp[i]);
else dp[u]+=dp[i];
}
}
int main()
{
int n;
sca(n);
for(int i=1;i<=n;i++)sca(a[i]);
for(int i=2;i<=n;i++)
{
int fa;
sca(fa);
V[fa].pb(i);
}
dfs(1);
cout<<cnt-dp[1]+1<<endl;
}