//dp[i]:if Max v is w, then need w + dp[i]
#include <iostream>
#include <cstring>
using namespace std;
const int N = 3e5 + 10;
int n, leaf;
int fa[N], dp[N], m[N];
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int x) {
for (int i = h[x]; ~i; i = ne[i]) {
int j = e[i];
dfs(j);
}
if (h[x] == -1) dp[x] = 0, leaf ++;
else {
if (m[x]) {
dp[x] = 998244353;
for (int i = h[x]; ~i; i = ne[i]) dp[x] = min(dp[x], dp[e[i]]);
}
else {
for (int i = h[x]; ~i; i = ne[i]) dp[x] += dp[e[i]] + 1;
dp[x] --;
}
}
}
int main() {
memset(h, -1, sizeof h);
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%d", &m[i]);
for (int i = 2; i <= n; i ++) {
scanf("%d", &fa[i]);
add(fa[i], i);
}
dfs(1);
printf("%d", leaf - dp[1]);
return 0;
}
1157E - Minimum Array | 1661D - Progressions Covering |
262A - Roma and Lucky Numbers | 1634B - Fortune Telling |
1358A - Park Lighting | 253C - Text Editor |
365B - The Fibonacci Segment | 75A - Life Without Zeros |
1519A - Red and Blue Beans | 466A - Cheap Travel |
659E - New Reform | 1385B - Restore the Permutation by Merger |
706A - Beru-taxi | 686A - Free Ice Cream |
1358D - The Best Vacation | 1620B - Triangles on a Rectangle |
999C - Alphabetic Removals | 1634C - OKEA |
1368C - Even Picture | 1505F - Math |
1473A - Replacing Elements | 959A - Mahmoud and Ehab and the even-odd game |
78B - Easter Eggs | 1455B - Jumps |
1225C - p-binary | 1525D - Armchairs |
1257A - Two Rival Students | 1415A - Prison Break |
1271A - Suits | 259B - Little Elephant and Magic Square |