2022 CCPC Henan Provincial Collegiate Programming Contest
Problem
Solution
Code
int n;
int a[N], ans[N], mi[N], sz[N];
vector<int> v[N];
void dfs(int x, int fa)
{
mi[x] = inf;
sz[x] = 1;
for (int y : v[x])
{
if (y == fa) continue;
dfs(y, x);
sz[x] += sz[y];
mi[x] = min(mi[x], mi[y]);
}
if (mi[x] > a[x]) ans[a[x]] = n - sz[x];
mi[x] = min(mi[x], a[x]);
}
int main()
{
IOS;
cin >> n;
int root = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] == 0) root = i;
}
for (int i = 2, x; i <= n; i++)
{
cin >> x;
v[x].push_back(i);
v[i].push_back(x);
}
dfs(root, -1);
ans[0] = 0;
for (int y : v[root])
ans[0] = max(ans[0], sz[y]);
ans[n] = n;
for (int i = 0; i <= n; i++)
cout << ans[i] << " ";
return 0;
}