제출 #1340501

#제출 시각아이디문제언어결과실행 시간메모리
1340501WH8Team Coding (EGOI24_teamcoding)C++17
50 / 100
4094 ms28568 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define mt make_tuple
#define mp make_pair
#define pb push_back
#define int long long 
#define f first
#define s second
#define pll pair<long long, long long>
#define iii tuple<int,int,int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()

const int b=305;
signed main(){
	int n,k;cin>>n>>k;
	vector<int> c(n); for(int i=0;i<n;i++)cin>>c[i];
	vector<vector<int>> grp(n);
	vector<int> pre(n, 0), post(n, 0), lay(n, 0);
	vector<vector<int>> layer(n);
	vector<vector<int>> ch(n);
	for(int i=1;i<n;i++){
		int b;cin>>b;
		ch[b].pb(i);
	}
	int t=0;
	auto dfs=[&](auto && dfs, int x) -> void{
		pre[x]=t++;
		layer[lay[x]].pb(pre[x]);
		grp[c[x]].pb(x);
		for(auto it: ch[x]){
			lay[it]=lay[x]+1;
			dfs(dfs, it);
		}
		post[x]=t-1;
	};
	dfs(dfs, 0);
	pair<int,int> ans={0, 0};
	for (int i=0;i<n;i++){
		map<int,int> tot;
		for(int j : grp[i]){
			tot[lay[j]]++;
		}
		/*for (auto [l, totcnt] : tot){
			printf("col %lld, layer %lld, cnt %lld\n", i, l, totcnt);
		}*/
		for(int j : grp[i]){
			map<int,int> und;
			for(int k : grp[i]){
				if(pre[j] <= pre[k] and post[j] >= pre[k]){
					und[lay[k]]++;
				}
			}
			pll cand={0, 0};
			for(auto [l, totcnt] : tot){
				int undcnt=und[l];
				int sl=upper_bound(all(layer[l]), post[j])-lower_bound(all(layer[l]), pre[j]);
				//printf("parent %lld, l %lld, totcnt %lld, sl %lld\n", j, l, totcnt, sl);
				int u=min(sl, totcnt);
				int cost=u-und[l];
				cand.f += u, cand.s += cost;
			}
			if(cand.f > ans.f or (cand.f == ans.f and cand.s < ans.s)) ans=cand;
		}
	}
	cout<<ans.f<<" "<<ans.s;
}
#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...