Submission #1346565

#TimeUsernameProblemLanguageResultExecution timeMemory
1346565julia_08Team Coding (EGOI24_teamcoding)C++20
42 / 100
4093 ms17216 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 10;

int val[MAXN];

int pre[MAXN], pos[MAXN], dist[MAXN];

int tot[MAXN], cnt[MAXN], lvl[MAXN];

vector<int> adj[MAXN], vtx[MAXN];

int n;

int t = 0;

void dfs_1(int v){

  pre[v] = ++t;

  for(auto u : adj[v]){
    dist[u] = dist[v] + 1;
    dfs_1(u);
  }

  pos[v] = t;

}

pair<int, int> process(int s, int k){

  queue<int> q;

  q.push(s);

  vector<int> visited;

  while(!q.empty()){

    int v = q.front();
    q.pop();

    if(tot[dist[v]] == 0) visited.push_back(dist[v]);

    tot[dist[v]] ++;
    if(val[v] == k) cnt[dist[v]] ++;

    for(auto u : adj[v]) q.push(u);

  }

  pair<int, int> ret = {0, 0};

  for(auto d : visited){

    int cur = min(tot[d], lvl[d]);

    ret.first += cur;
    ret.second -= cur - cnt[d];

    tot[d] = cnt[d] = 0;

  }

  return ret;

}

pair<int, int> dfs_2(int v, int k){

  pair<int, int> ret = {0, -n};

  if(val[v] == k) return process(v, k);

  for(auto u : adj[v]) ret = max(ret, dfs_2(u, k));

  return ret;

}

pair<int, int> solve(int k){

  for(int i=0; i<n; i++) lvl[i] = 0;

  for(auto v : vtx[k]) lvl[dist[v]] ++;

  return dfs_2(1, k);

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int k; cin >> n >> k;

  for(int i=1; i<=n; i++){
   
    cin >> val[i];
    vtx[val[i]].push_back(i);
  
  }

  for(int i=0; i<k; i++){
    sort(vtx[i].begin(), vtx[i].end(), [&] (int a, int b){
      return pre[a] < pre[b];
    });
  }

  for(int i=2; i<=n; i++){
    
    int p; cin >> p;
    p ++;
    
    adj[p].push_back(i);
  
  }
 
  pair<int, int> ans = {0, -n};

  dfs_1(1);

  for(int i=0; i<k; i++) ans = max(ans, solve(i));

  cout << ans.first << " " << -ans.second << "\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...