제출 #1329416

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

const int MAX_N=100005;

vector<int> adj[MAX_N];

int preferred[MAX_N];
int st[MAX_N];
int ed[MAX_N];
int depth[MAX_N];
int xd[MAX_N];
int timer=0;

vector<int> dn[MAX_N];
vector<int> nodes[MAX_N];
vector<int> lang[MAX_N];

void dfs(int u, int d)
{
    st[u]=++timer;
    depth[u]=d;
    xd[u]=d;

    dn[d].push_back(st[u]);

    for(int v : adj[u])
    {
        dfs(v,d+1);

        xd[u]=max(xd[u],xd[v]);
    }

    ed[u]=timer;
}

int range(const vector<int>& v, int l, int r)
{
    return upper_bound(v.begin(),v.end(),r)-lower_bound(v.begin(),v.end(),l);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,k;
    cin>>n>>k;

    for(int i=0; i<n; i++)
    {
        cin>>preferred[i];

        nodes[preferred[i]].push_back(i);
    }

    for(int i=1; i<n; i++)
    {
        int boss;
        cin>>boss;

        adj[boss].push_back(i);
    }

    dfs(0,0);

    for(int g=0; g<k; g++)
    {
        for(int u : nodes[g])
        {
            lang[g].push_back(st[u]);
        }

        sort(lang[g].begin(),lang[g].end());
    }

    int xp=0;
    int ns=0;

    for(int g=0; g<k; g++)
    {
        if(nodes[g].empty())
        {
            continue;
        }

        vector<pair<int,int>> cg;
        vector<int> dl;

        for(int u : nodes[g])
        {
            dl.push_back(depth[u]);
        }

        sort(dl.begin(),dl.end());

        for(int i=0; i<(int)dl.size(); )
        {
            int d=dl[i];
            int cnt=0;

            while(i<(int)dl.size() && dl[i]==d)
            {
                cnt++;
                i++;
            }

            cg.push_back({d,cnt});
        }

        for(int u : nodes[g])
        {
            int cp=0;

            auto its=lower_bound(cg.begin(),cg.end(),make_pair(depth[u],-1));
            auto ite=upper_bound(cg.begin(),cg.end(),make_pair(xd[u],n+1));

            for(auto it=its; it!=ite; it++)
            {
                int d=it->first;
                int c=it->second;
                int s=range(dn[d],st[u],ed[u]);

                cp+=min(s,c);
            }

            int iu=range(lang[g],st[u],ed[u]);
            int cs=cp-iu;

            if(cp>xp)
            {
                xp=cp;
                ns=cs;
            }
            else if(cp==xp)
            {
                if(cs<ns)
                {
                    ns=cs;
                }
            }
        }
    }

    cout<<xp<<" "<<ns<<endl;

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