// subtask 2
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 1;
int col[maxn];
vector <int> adj[maxn];
vector <vector <int>> grps, grps2;
int depth[maxn];
void dfs(int s, int d) {
grps[d][col[s]]++;
grps2[d][col[s]]++;
depth[s] = d;
for (auto i : adj[s]) {
dfs(i, d+1);
}
}
pair <int, int> ans;
queue <int> q;
pair <int, int> get_best(pair <int, int> a, pair <int, int> b) {
if (a.first > b.first)
return a;
if (b.first > a.first)
return b;
if (a.second < b.second)
return a;
return b;
}
pair <int, int> dfs2(int s, int c, int d) {
pair <int, int> res = {0, 0};
if (col[s] == c)
res.first++;
else if (grps2[d][c] > 0) {
res.first++;
q.push(d);
grps2[d][c]--;
grps2[d][1-c]++;
res.second++;
} else if (d == 1)
return {0, 0};
for (auto i : adj[s]) {
auto res2 = dfs2(i, c, d+1);
res.first += res2.first;
res.second += res2.second;
}
return res;
}
void reset_grps() {
while (!q.empty()) {
int x = q.front();
q.pop();
grps2[x][0] = grps[x][0];
grps2[x][1] = grps[x][1];
}
}
int main() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> col[i];
for (int i = 1; i < n; i++) {
int p;
cin >> p;
adj[p].push_back(i);
}
grps2 = grps = vector <vector <int>> (n+1, vector <int> (2));
dfs(0, 0);
for (int i = 0; i < n; i++) {
if (col[i] == col[0])
ans.first++;
}
for (auto i : adj[0]) {
reset_grps();
ans = get_best(ans, dfs2(i, col[i], 1));
reset_grps();
ans = get_best(ans, dfs2(i, 1-col[i], 1));
}
cout << ans.first << ' ' << ans.second << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |