Submission #1148511

#TimeUsernameProblemLanguageResultExecution timeMemory
1148511Ghulam_JunaidTeam Coding (EGOI24_teamcoding)C++20
31 / 100
226 ms138172 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 100;
int n, k, par[N], a[N], h[N], ans[N], sub_ans[N];
map<int, int> cnt[N], anc, sac[N];
vector<int> g[N];
deque<int> dq[N];
bool good[N];

void dfs(int v){
    cnt[a[v]][h[v]]++;

    if (anc.find(a[v]) == anc.end()) good[v] = 1;
    anc[a[v]]++;

    for (int u : g[v]){
        h[u] = h[v] + 1;
        dfs(u);
    }
    anc[a[v]]--;
    if (anc[a[v]] == 0) anc.erase(a[v]);
}

void calc(int v){
    int mx = -1;
    for (int u : g[v]){
        calc(u);
        if (mx == -1 or dq[u].size() > dq[mx].size())
            mx = u;
    }

    if (mx == -1){
        dq[v].push_front(1);
        sac[v][a[v]]++;
        if (good[v]) ans[v] = 1, sub_ans[v] = 1;
        return ;
    }

    swap(dq[v], dq[mx]);
    swap(sac[v], sac[mx]);
    for (int u : g[v]){
        if (u == mx) continue;
        for (int i = 0; i < dq[u].size(); i ++)
            dq[v][i] += dq[u][i];
        for (auto [val, c] : sac[u])
            sac[v][val] += c;
    }
    dq[v].push_front(1);
    sac[v][a[v]]++;

    if (!good[v]) return ;
    for (auto [lvl, c] : cnt[a[v]]){
        int l = lvl - h[v];
        if (l < 0) continue;
        ans[v] += min(c, dq[v][l]);
    }
    sub_ans[v] = sac[v][a[v]];
}

int main(){
    cin >> n >> k;
    for (int i = 0; i < n; i ++)
        cin >> a[i];
    for (int i = 1; i < n; i ++)
        cin >> par[i], g[par[i]].push_back(i);
    
    dfs(0);
    calc(0);

    int mx = 0, mn = n;
    for (int v = 0; v < n; v ++){
        if (!good[v]) continue;
        if (mx < ans[v] or (mx == ans[v] and mn > (ans[v] - sub_ans[v])))
            mx = ans[v], mn = ans[v] - sub_ans[v];
    }
    cout << mx << " " << mn << endl;
}
#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...