Submission #1148330

#TimeUsernameProblemLanguageResultExecution timeMemory
1148330Jawad_Akbar_JJTeam Coding (EGOI24_teamcoding)C++20
62 / 100
4093 ms35516 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;
vector<int> nei[N], cols[N], Ver[N], lev[N], vc;
vector<pair<int,int>> Vec;
int st[N], en[N], alr[N], Seen[N], cnt[N], cur, a[N];

void dfs(int u, int p, int h){
	st[u] = cur++;
	cols[h].push_back(a[u]);
	Ver[h].push_back(st[u]);

	Vec.push_back({h, a[u]});
	alr[u] = cnt[a[u]]++;
	Seen[a[u]]++;
	if (Seen[a[u]] == 1)
		vc.push_back(u);

	for (int i : nei[u]){
		if (i == p) continue;
		dfs(i, u, h + 1);
	}
	Seen[a[u]]--;
	alr[u] = cnt[a[u]] - alr[u];

	en[u] = cur++;
}

int check(int rt, int ans = 0){
	for (int i : lev[a[rt]]){
		int m1 = upper_bound(begin(cols[i]), end(cols[i]), a[rt]) - upper_bound(begin(cols[i]), end(cols[i]), a[rt] - 1);
		int m2 = upper_bound(begin(Ver[i]), end(Ver[i]), en[rt]) - upper_bound(begin(Ver[i]), end(Ver[i]), st[rt] - 1);
		ans += min(m1, m2);
	}
	return ans;
}

int main(){
	int n, k, p, Ans1 = 0, Ans2;
	cin>>n>>k;

	for (int i=1;i<=n;i++)
		cin>>a[i];

	for (int i=2;i<=n;i++){
		cin>>p;
		nei[p + 1].push_back(i);
	}

	dfs(1, 1, 1);
	sort(begin(Vec), end(Vec));

	for (int i=1;i<=n;i++){
		sort(begin(Ver[i]), end(Ver[i]));
		sort(begin(cols[i]), end(cols[i]));
	}

	for (auto [i, j] : Vec){
		if (lev[j].size() == 0 or lev[j].back() != i)
			lev[j].push_back(i);
	}

	for (int i : vc){
		int ret = check(i);
		if (ret > Ans1)
			Ans1 = ret, Ans2 = ret - alr[i];
		else if (ret == Ans1)
			Ans2 = min(Ans2, ret - alr[i]);
	}
	cout<<Ans1<<" "<<Ans2<<'\n';

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