제출 #1220920

#제출 시각아이디문제언어결과실행 시간메모리
1220920overwatch9Team Coding (EGOI24_teamcoding)C++20
0 / 100
48 ms29252 KiB
// 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 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...