Submission #1221098

#TimeUsernameProblemLanguageResultExecution timeMemory
1221098overwatch9Team Coding (EGOI24_teamcoding)C++20
23 / 100
36 ms8644 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2000 + 1; vector <int> adj[maxn]; int grps[maxn][maxn]; int col[maxn]; int depth[maxn]; void dfs(int s, int d) { depth[s] = d; grps[d][col[s]]++; for (auto i : adj[s]) dfs(i, d+1); } 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; } vector <pair <int, int>> f; void dfs2(int s, int c) { if (col[s] == c) f[depth[s]].first++; f[depth[s]+1].second += (int)adj[s].size(); for (auto i : adj[s]) dfs2(i, c); } 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); } dfs(0, 0); pair <int, int> ans = {0, 0}; for (int i = 0; i < n; i++) { // set i as the head f.clear(); f.resize(n+2); dfs2(i, col[i]); pair <int, int> tp = {1, 0}; for (int d = depth[i]+1; d < n; d++) { tp.first += f[d].first; if (grps[d][col[i]] > f[d].first) { int extra = min(grps[d][col[i]] - f[d].first, f[d].second - f[d].first); tp.first += extra; tp.second += extra; } } ans = get_best(ans, tp); } cout << ans.first << ' ' << ans.second << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...