Submission #1343015

#TimeUsernameProblemLanguageResultExecution timeMemory
1343015nathlol2Team Coding (EGOI24_teamcoding)C++20
23 / 100
4127 ms951160 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, k, tt, a[N], sz[N], lvl[N], in[N], out[N], rin[N], smlvl[N], mxd[N], csmlvl[N];
vector<int> adj[N];
unordered_map<int, int> cnt[N], ccnt[N];
pair<int, int> ans;

void dfs(int u, int d){
    sz[u] = 1;
    lvl[u] = d;
    smlvl[d]++;
    in[u] = ++tt;
    rin[tt] = u;
    cnt[d][a[u]]++;
    for(auto v : adj[u]) dfs(v, d + 1), sz[u] += sz[v], mxd[u] = max(mxd[u], mxd[v]);
    out[u] = tt;
    mxd[u] = max(mxd[u], d);
}

void add(int u){
    ccnt[lvl[u]][a[u]]++;
    csmlvl[lvl[u]]++;
}

void rem(int u){
    ccnt[lvl[u]][a[u]]--;
    csmlvl[lvl[u]]--;
}

void sack(int u, bool d){
    pair<int, int> hv;
    for(auto v : adj[u]) hv = max(hv, {sz[v], v});
    for(auto v : adj[u]) if(v != hv.second) sack(v, 1);
    if(hv.second) sack(hv.second, 0);
    for(auto v : adj[u]) if(v != hv.second) for(int i = in[v];i<=out[v];i++) add(rin[i]);
    add(u);
    int res = 1, swp = 0;
    for(int i = lvl[u] + 1;i<=mxd[u];i++){
        int nt = cnt[i][a[u]] - ccnt[i][a[u]]; //not in subtree a[u]
        int snt = csmlvl[i] - ccnt[i][a[u]]; //in subtree not a[u]
        swp += min(nt, snt);
        res += ccnt[i][a[u]] + min(nt, snt);
    }
    if(res > ans.first) ans = {res, swp};
    else if(res == ans.first && swp < ans.second) ans = {res, swp};
    if(d) for(int i = in[u];i<=out[u];i++) rem(rin[i]);
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> k;
    for(int i = 0;i<n;i++) cin >> a[i];
    for(int i = 1;i<n;i++){
        int u; cin >> u;
        adj[u].push_back(i);
    }
    dfs(0, 1);
    sack(0, 0);
    cout << ans.first << ' ' << ans.second;
}
#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...