Submission #1362780

#TimeUsernameProblemLanguageResultExecution timeMemory
1362780branches1029Team Coding (EGOI24_teamcoding)C++20
100 / 100
1149 ms45724 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, k, t;
int ans;
int const BLOCK=322;
int c[100005];
int dep[100005];
int tin[100005];
int tout[100005];
int up[100005];
bool cal[100005];
vector<int> v[100005];
vector<int> a[100005];
vector<int> d[100005];
unordered_map<int,int> mp;
map< pair<int,int>, int > cnt1;
unordered_map<int,int> cnt2;
unordered_map<int,int> cnt3;

void dfs( int i ){
    tin[i]=t++;
    d[dep[i]].push_back(tin[i]);
    cnt1[{ c[i], dep[i] }]++;
    if( !up[c[i]] ) cal[i]=true;
    up[c[i]]++;
    for( int u : a[i] ){
        dep[u]=dep[i]+1;
        dfs( u );
    }
    tout[i]=t++;
    up[c[i]]--;
}

int mx_dep;
void dfs2( int i, int co ){
    cnt2[dep[i]]++;
    mx_dep=max( mx_dep, dep[i] );
    if( c[i]==co ) cnt3[dep[i]]++;
    for( int u : a[i] ){
        dfs2( u, co );
    }
}

int main(){

    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> k;
    for( int i=0 ; i<n ; i++ ){
        cin >> c[i];
        v[c[i]].push_back(i);
    }
    for( int i=1 ; i<n ; i++ ){
        int x;
        cin >> x;
        a[x].push_back(i);
    }

    t=1;
    dep[0]=0;
    dfs( 0 );

    pair<int,int> ans={0,0};
    for( int i=0 ; i<n ; i++ ){
        if( v[c[i]].size()<=BLOCK ){
            int mx=1;
            int sw=0;
            mp.clear();
            for( int u : v[c[i]] ){
                if( dep[u]<=dep[i] ) continue;
                if( tin[i]<=tin[u] && tout[u]<=tout[i] ){
                    if( !mp[dep[u]] ){
                        int l=lower_bound( d[dep[u]].begin(), d[dep[u]].end(), tin[i] )-d[dep[u]].begin();
                        int r=lower_bound( d[dep[u]].begin(), d[dep[u]].end(), tout[i] )-d[dep[u]].begin();
                        mp[dep[u]]=r-l;
                    }
                    mp[dep[u]]--;
                    if( mp[dep[u]]==0 ) mp[dep[u]]=-1;
                    mx++;
                }
            }
            for( int u : v[c[i]] ){
                if( dep[u]<=dep[i] ) continue;
                if( !(tin[i]<=tin[u] && tout[u]<=tout[i]) ){
                    if( !mp[dep[u]] ){
                        int l=lower_bound( d[dep[u]].begin(), d[dep[u]].end(), tin[i] )-d[dep[u]].begin();
                        int r=lower_bound( d[dep[u]].begin(), d[dep[u]].end(), tout[i] )-d[dep[u]].begin();
                        mp[dep[u]]=r-l;
                    }
                    if( mp[dep[u]]==0 ) mp[dep[u]]=-1;
                    if( mp[dep[u]]==-1 ) continue;
                    mp[dep[u]]--;
                    if( mp[dep[u]]==0 ) mp[dep[u]]=-1;
                    mx++;
                    sw++;
                }
            }
            ans=max( ans, make_pair(mx, -sw) );
        }
        else{
            if( !cal[i] ) continue;
            cnt2.clear(), cnt3.clear();
            mx_dep=0;
            dfs2( i, c[i] );
            pair<int,int> p={0, 0};
            for( int j=dep[i]+1 ; j<=mx_dep ; j++ ){
                p.first+=min( cnt2[j], cnt1[{c[i], j}] );
                p.second+=cnt3[j];
            }
            p.second=-(p.first-p.second);
            p.first++;
            ans=max( ans, p );
        }
    }

    cout << ans.first << ' ' << -ans.second << '\n';

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...