Submission #1177611

#TimeUsernameProblemLanguageResultExecution timeMemory
1177611WarinchaiTeam Coding (EGOI24_teamcoding)C++20
0 / 100
4094 ms43080 KiB
#include<bits/stdc++.h> using namespace std; int c[100005]; vector<int>adj[100005]; int cnt[100005]; map<int,int>lvl[100005]; map<int,int>has[100005]; pair<int,int> ans[100005]; pair<int,int>rans; pair<int,int>rrans; int d[100005]; void dfscnt(int u,int p,int val){ d[u]=d[p]+1; for(auto x:adj[u]){ dfscnt(x,u,val); } if(c[u]==val)cnt[d[u]]++; //cerr<<"depth:"<<d[u]<<" "<<cnt[d[u]]<<' '<<val<<"\n"; } void dfs(int u,int p,int val){ for(auto x:adj[u]){ dfs(x,u,val); } //cerr<<"u:"<<u<<"\n"; for(auto x:adj[u]){ if(lvl[x].size()>lvl[u].size())swap(lvl[x],lvl[u]),swap(ans[x],ans[u]),swap(has[x],has[u]); //cerr<<"add x:"<<x<<"\n"; for(auto [d,freq]:lvl[x]){ int cur=min(lvl[u][d]+lvl[x][d],cnt[d]); int prv=min(lvl[u][d],cnt[d]); //cerr<<cur<<" "<<prv<<" "<<d<<" "<<has[x][d]<<" "<<has[u][d]<<"\n"; ans[u].first+=(cur-prv); ans[u].second+=cur-has[x][d]-has[u][d]; lvl[u][d]+=lvl[x][d]; has[u][d]+=has[x][d]; } } lvl[u][d[u]]++; if(cnt[d[u]]){ ans[u].first++; } if(c[u]==val){ has[u][d[u]]++; if(ans[u].first>rans.first)rans=ans[u]; else if(ans[u].first==rans.first)rans.second=min(rans.second,ans[u].second); //cerr<<"ANS:"<<u<<":"<<ans[u].first<<' '<<ans[u].second<<"\n"; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,k;cin>>n>>k; for(int i=0;i<n;i++){ cin>>c[i+1]; } for(int i=1;i<n;i++){ int x;cin>>x; adj[x+1].push_back(i+1); } rrans={0,0}; for(int i=0;i<k;i++){ rans={0,0}; for(int i=1;i<=n;i++)has[i].clear(),lvl[i].clear(),ans[i]={0,0},cnt[i]=0; dfscnt(1,0,i); dfs(1,0,i); if(rans.first>rrans.first)rrans=rans; else if(rans.first==rrans.first)rrans.second=min(rrans.second,rans.second); } cout<<rrans.first<<" "<<rrans.second; }
#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...