제출 #1346627

#제출 시각아이디문제언어결과실행 시간메모리
1346627julia_08Team Coding (EGOI24_teamcoding)C++20
50 / 100
4093 ms25432 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 10;

int val[MAXN];

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

int cnt[MAXN];

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

int n;

int t = 0;

void dfs_1(int v){

  pre[v] = ++t;
  all_lvls[dist[v]].push_back(pre[v]);

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

  pos[v] = t;

}

bool sub(int a, int b){
  return pre[b] <= pre[a] && pos[a] <= pos[b];
}

int get(int v, int d){
  return upper_bound(all_lvls[d].begin(), all_lvls[d].end(), pos[v]) - lower_bound(all_lvls[d].begin(), all_lvls[d].end(), pre[v]);
}

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

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

  vector<int> visited;

  for(auto v : vtx[k]){
    if(cnt[dist[v]] == 0) visited.push_back(dist[v]);
    cnt[dist[v]] ++;
  }

  for(auto v : vtx[k]){

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

    for(auto u : vtx[k]) cur.second += sub(u, v);

    for(auto d : visited){

      int aux = min(get(v, d), cnt[d]);
      
      cur.first += aux;
      cur.second -= aux;

    }

    ret = max(ret, cur);

  }

  for(auto d : visited) cnt[d] = 0;

  return ret;

}

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...