Submission #1343032

#TimeUsernameProblemLanguageResultExecution timeMemory
1343032nathlol2Team Coding (EGOI24_teamcoding)C++20
0 / 100
9 ms11460 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, SQ = 2005;
int n, k, tt, ans, a[N], sz[N], lvl[N], in[N], out[N], rin[N], smlvl[N], mxd[N], csmlvl[N], res[N], li[N], fq[N];
vector<int> adj[N], dep[N];
unordered_map<int, int> cnt[N], ccnt[N];

void dfssz(int u, int d){
    dep[a[u]].push_back(d);
    sz[u] = 1;
    lvl[u] = d;
    smlvl[d]++;
    in[u] = ++tt;
    rin[tt] = u;
    cnt[d][a[u]]++;
    for(auto v : adj[u]) dfssz(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);
    res[u] = 1;
    if(li[a[u]]){
        for(auto x : dep[a[u]]){
            if(x <= lvl[u]) continue;
            res[u] += min(cnt[x][a[u]], csmlvl[x]);
        }
    }
    ans = max(ans, res[u]);
    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], fq[a[i]]++;
    for(int i = 0;i<k;i++){
        if(fq[i] <= SQ) li[i] = 1;
    }
    for(int i = 1;i<n;i++){
        int u; cin >> u;
        adj[u].push_back(i);
    }
    dfssz(0, 1);
    for(int i = 0;i<k;i++){
        sort(dep[i].begin(), dep[i].end());
        dep[i].erase(unique(dep[i].begin(), dep[i].end()), dep[i].end());
    }
    sack(0, 0);
    cout << ans << '\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...