Submission #1148352

#TimeUsernameProblemLanguageResultExecution timeMemory
1148352MuhammadSaramTeam Coding (EGOI24_teamcoding)C++20
50 / 100
4093 ms21572 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(v) v.begin(), v.end()

const int M = 1e5 + 1;

vector<int> nei[M],ver[M];
int dep[M],st[M],en[M],t;

void dfs(int u)
{
	st[u]=t++;
	ver[dep[u]].push_back(st[u]);
	for (int i:nei[u])
		dep[i]=dep[u]+1,dfs(i);
	en[u]=t++;
}

int main()
{
	int n,k;
	cin>>n>>k;
	vector<int> v[k];
	for (int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		v[x].push_back(i);
	}
	for (int i=1;i<n;i++)
	{
		int p;
		cin>>p;
		nei[p].push_back(i);
	}
	dfs(0);
	int ans=0,s=0;
	for (int l=0;l<k;l++)
	{
		for (int u:v[l])
		{
			map<int,int> cnt,tot;
			int x=1,y=0;
			for (int j:v[l])
			{
				if (dep[j]<=dep[u]) continue;
				if (tot.find(dep[j])==tot.end())
					tot[dep[j]]=lower_bound(all(ver[dep[j]]),en[u])-lower_bound(all(ver[dep[j]]),st[u]);
				if (st[j]>st[u] && st[j]<en[u])
					x++,tot[dep[j]]--;
				else
					cnt[dep[j]]++;
			}
			for (auto [d,c]:cnt)
				x+=min(c,tot[d]),y+=min(c,tot[d]);
			if (x>ans)
				ans=x,s=y;
			else if(x==ans)
				s=min(s,y);
		}
	}
	cout<<ans<<' '<<s<<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...