Submission #1191225

#TimeUsernameProblemLanguageResultExecution timeMemory
1191225ofozTeam Coding (EGOI24_teamcoding)C++20
23 / 100
4119 ms1114112 KiB
#include <bits/stdc++.h> #define pi pair<int, int> using namespace std; const int MAXN = 200005; int n, k; int col[MAXN]; vector<vector<int>> adj; vector<vector<int>> colorCnt; pair<int, int> res = {0, 0}; void dfs1(int v, int level, vector<int>& vertices) { stack<pi> s; s.push({v, level}); while (!s.empty()) { tie(v, level) = s.top(); s.pop(); vertices[level]++; for (int to : adj[v]) { s.push({to, level + 1}); } } } void dfs2(int v, int level, vector<vector<int>>& colorCnt) { stack<pi> s; s.push({v, level}); while (!s.empty()) { tie(v, level) = s.top(); s.pop(); colorCnt[level][col[v]]++; for (int to : adj[v]) { s.push({to, level + 1}); } } } int dfs3(int v, int c) { int res = 0; if (col[v] == c) res++; for (int to : adj[v]) { res += dfs3(to, c); } return res; } void dfs(int v, int level, const vector<vector<int>>& colorCnt) { int c = col[v]; vector<int> vertices(n, 0); dfs1(v, level, vertices); int coders = 0, swaps = 0; for (int l = level + 1; l < n; l++) { coders += min(vertices[l], colorCnt[l][c]); } swaps = (coders + 1) - dfs3(v, c); if (coders > res.first || (coders == res.first && swaps < res.second)) { res = {coders, swaps}; } for (int to : adj[v]) { dfs(to, level + 1, colorCnt); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> col[i]; } adj.assign(n, vector<int>()); for (int i = 1; i < n; ++i) { int x; cin >> x; adj[x].push_back(i); } colorCnt.assign(n, vector<int>(k, 0)); dfs2(0, 0, colorCnt); dfs(0, 0, colorCnt); cout << res.first + 1 << " " << res.second << "\n"; return 0; }
#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...