Submission #1221008

#TimeUsernameProblemLanguageResultExecution timeMemory
1221008toast12Team Coding (EGOI24_teamcoding)C++20
0 / 100
2584 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> a, depth;
vector<vector<int>> adj;
vector<vector<int>> freq;

void dfs(int cur, int p) {
    depth[cur] = depth[p]+1;
    freq[depth[cur]][a[cur]]++;
    for (auto e : adj[cur]) {
        if (e != p) dfs(e, cur);
    }
}

pair<int, int> dfs2(int cur, int p, int color) {
    pair<int, int> ret;
    if (a[cur] == color) ret.first++;
    int cnt = 0, children = 0;
    for (auto e : adj[cur]) {
        if (e != p) {
            children++;
            pair<int, int> x = dfs2(e, cur, color);
            ret.first += x.first, ret.second += x.second;
            if (a[e] == color) cnt++;
        }
    }
    freq[depth[cur]+1][color] -= cnt;
    if (cnt == children) return ret;
    if (freq[depth[cur]+1][color] > 0) {
        int temp = min(children-cnt, freq[depth[cur]+1][color]);
        ret.first += temp;
        ret.second += temp;
        freq[depth[cur]+1][color] -= temp;
    }
    return ret;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    int n, k;
    cin >> n >> k;
    a.resize(n+1);
    adj.resize(n+1);
    for (int i = 0; i < n; i++) cin >> a[i];
    vector<int> parent(n);
    parent[0] = -1;
    for (int i = 1; i < n; i++) {
        int p;
        cin >> p;
        adj[p].push_back(i);
        adj[i].push_back(p);
        parent[i] = p;
    }
    depth.resize(n+1);
    depth[0] = -1;
    freq.resize(n+1, vector<int>(n+1));
    dfs(0, 0);
    vector<vector<int>> v = freq;
    int ans1 = 0, ans2 = 0;
    for (int i = 0; i < n; i++) {
        // make this person the boss
        freq = v;
        pair<int, int> x = dfs2(i, parent[i], a[i]);
        if (x.first > ans1) {
            ans1 = x.first;
            ans2 = x.second;
        }
        else if (x.first == ans1) {
            ans2 = min(ans2, x.second);
        }
    }
    cout << ans1 << ' ' << ans2 << '\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...