#include <bits/stdc++.h>
using namespace std; // user preference
struct FastIO { // minimal fast input
FastIO() { ios::sync_with_stdio(false); cin.tie(nullptr); }
} fastio;
int main() {
int N, K;
if (!(cin >> N >> K)) return 0;
vector<int> lang(N);
for (int &x : lang) cin >> x;
vector<vector<int>> g(N);
for (int i = 1; i < N; ++i) {
int boss; cin >> boss;
g[boss].push_back(i);
}
/* ---------- Euler tour & basic tables ---------- */
vector<int> tin(N), tout(N), depth(N), euler;
vector<vector<int>> depthNodes; // tin indices per depth
vector<vector<int>> langTin(K); // tin indices per language
vector<vector<int>> langDepthRaw(K); // raw depth list per language
vector<int> shallowNode(K, -1), shallowDep(K, INT_MAX);
int timer = 0;
function<void(int,int)> dfs = [&](int u, int dep) {
depth[u] = dep;
if ((int)depthNodes.size() <= dep) depthNodes.emplace_back();
tin[u] = timer++;
depthNodes[dep].push_back(tin[u]);
int c = lang[u];
langTin[c].push_back(tin[u]);
langDepthRaw[c].push_back(dep);
if (dep < shallowDep[c]) { shallowDep[c] = dep; shallowNode[c] = u; }
for (int v : g[u]) dfs(v, dep + 1);
tout[u] = timer - 1;
};
dfs(0, 0);
/* ---------- compress (depth , count) per language ---------- */
vector<vector<pair<int,int>>> langDepthCnt(K);
for (int c = 0; c < K; ++c) {
auto &vec = langDepthRaw[c];
if (vec.empty()) continue;
sort(vec.begin(), vec.end());
for (std::size_t i = 0, j; i < vec.size(); i = j) {
j = i;
while (j < vec.size() && vec[j] == vec[i]) ++j;
langDepthCnt[c].push_back({vec[i], int(j - i)});
}
}
/* ---------- helpers ---------- */
auto countInSub = [&](const vector<int>& arr, int L, int R) -> int {
auto lo = lower_bound(arr.begin(), arr.end(), L);
auto hi = upper_bound(arr.begin(), arr.end(), R);
return int(hi - lo);
};
/* ---------- scan all languages' shallowest leaders ---------- */
long long bestTeam = -1, bestSwaps = 0;
for (int c = 0; c < K; ++c) {
int lead = shallowNode[c];
if (lead == -1) continue; // language unused
int L = tin[lead], R = tout[lead];
long long team = 0;
for (auto [d, cntLangDepth] : langDepthCnt[c]) {
const auto &vec = depthNodes[d];
int S = countInSub(vec, L, R);
team += min<long long>(S, cntLangDepth);
}
int initial = countInSub(langTin[c], L, R);
long long swaps = team - initial;
if (team > bestTeam || (team == bestTeam && swaps < bestSwaps)) {
bestTeam = team;
bestSwaps = swaps;
}
}
cout << bestTeam << ' ' << bestSwaps << '\n';
return 0;
}
# | 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... |