Submission #1065335

#TimeUsernameProblemLanguageResultExecution timeMemory
1065335Dan4LifeTeam Coding (EGOI24_teamcoding)C++17
50 / 100
4075 ms53536 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)
using ar2 = array<int,2>;
const int mxN = (int)1e5+10;
const int INF = (int)1e9;
int n, k;
vector<int> adj[mxN];
ar2 ans{0,-INF};
vector<int> col[mxN];
int a[mxN], dep[mxN], sub[mxN];
vector<int> S[mxN];
set<ar2> Dep[mxN];
int dfs_timer, st[mxN], en[mxN];

void dfs1(int s, int p){
    sub[s] = 1; st[s]=++dfs_timer;
    if(p!=-1) dep[s]=dep[p]+1;
    for(auto u : adj[s]){
        if(u==p) continue;
        dfs1(u,s); sub[s]+=sub[u];
    }
    en[s] = dfs_timer;
}

bool upper(int a, int b){
    return st[a]<=st[b] and en[a]>=en[b];
}

void dfs(int s, int p){
    S[s].pb(s); Dep[s].insert({dep[s],1});
    for(auto u : adj[s]){
        if(u==p) continue;
        dfs(u,s);
        if(sz(S[s]) < sz(S[u])) S[s].swap(S[u]), Dep[s].swap(Dep[u]);
        for(auto v : S[u]) S[s].pb(v);
        for(auto [v,w] : Dep[u]){
            auto itr = Dep[s].lower_bound({v,-1});
            if(itr!=end(Dep[s]) and (*itr)[0]==v){
                int cur = (*itr)[1];
                Dep[s].erase(itr);
                Dep[s].insert({v,cur+w});
            }
            else Dep[s].insert({v,w});
        }
    }
    if(min(sub[s],sz(col[a[s]])) < ans[0]) return;
    
    auto cur = ar2({0,0});
    unordered_map<int,int> tot; tot.clear();
    for(auto u : col[a[s]]){
        if(upper(s,u)) cur[0]++,tot[dep[u]]++;
    }
    for(auto u : col[a[s]]){
        if(upper(s,u)) continue;
        auto itr = Dep[s].lower_bound({dep[u],-1});
        if(itr!=end(Dep[s]) and (*itr)[0]==dep[u]){
            if(tot[dep[u]] < (*itr)[1]){
                cur[0]++, cur[1]--; tot[dep[u]]++;
            }
        }
    }
    ans = max(ans, cur);
}

int main(){
    cin >> n >> k;
    for(int i = 0; i < n; i++){
        cin >> a[i]; col[a[i]].pb(i);
    }
    for(int i = 1; i < n; i++){
        int x; cin >> x; adj[i].pb(x), adj[x].pb(i);
    }
    dfs1(0,-1); 
    for(int i = 0; i < n; i++) 
        sort(all(adj[i]),[&](int a, int b){return sub[a]>sub[b]; });
    dfs(0,-1); cout << ans[0] << " " << -ans[1] << "\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...