Submission #1130067

#TimeUsernameProblemLanguageResultExecution timeMemory
1130067irmuunTeam Coding (EGOI24_teamcoding)C++20
50 / 100
4096 ms23748 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const int N=1e5;

int n,k;
int l[N],b[N],dep[N],tin[N],tout[N],cur=0;
vector<int>g[N],L[N];
vector<int>ver[N];

void dfs(int x){
    tin[x]=cur++;
    ver[dep[x]].pb(tin[x]);
    for(int y:g[x]){
        dep[y]=dep[x]+1;
        dfs(y);
    }
    tout[x]=cur++;
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>l[i];
        L[l[i]].pb(i);
    }
    for(int i=1;i<n;i++){
        cin>>b[i];
        g[b[i]].pb(i);
    }
    dep[0]=0;
    dfs(0);
    vector<int>count(n,0),used(n,0);
    int ans=0,op=0;
    for(int i=0;i<k;i++){
        if(L[i].empty()) continue;
        for(int x:L[i]){
            int res=1,mn=0;
            set<int>st;
            for(int y:L[i]){
                if(dep[y]<=dep[x]) continue;
                st.insert(dep[y]);
                count[dep[y]]++;
                if(tin[x]<tin[y]&&tout[y]<tout[x]){
                    used[dep[y]]++;
                }
            }
            for(int d:st){
                int slot=upper_bound(all(ver[d]),tout[x])-lower_bound(all(ver[d]),tin[x]);
                res+=min(slot,count[d]);
                mn+=min(slot,count[d])-used[d];
            }
            if(res>ans){
                ans=res;
                op=mn;
            }
            else if(res==ans){
                op=min(op,mn);
            }
            for(int y:L[i]){
                if(dep[y]<=dep[x]) continue;
                count[dep[y]]--;
                if(tin[x]<tin[y]&&tout[y]<tout[x]){
                    used[dep[y]]--;
                }
            }
        }
    }
    cout<<ans<<' '<<op;
}
#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...