Submission #1214824

#TimeUsernameProblemLanguageResultExecution timeMemory
1214824biankTeam Coding (EGOI24_teamcoding)C++20
100 / 100
2249 ms565164 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; const int N=1e5+9; int l[N]; vi adj[N]; unordered_map<int, int> cnt[N]; vi vals[N]; void dfs0(int u, int d=0){ cnt[l[u]][d]++; vals[l[u]].pb(d); for(int v:adj[u]) dfs0(v,d+1); } map<int, int> count_by_color[N]; deque<int> count_by_depth[N]; const int LIMIT=150; int res_by_color[N][LIMIT]; ii ans={0,0}; int n,k; void dfs(int u, int d=0){ count_by_color[u][l[u]]++; count_by_depth[u]={1}; forn(c,LIMIT) res_by_color[u][c]=min(1,cnt[c][d]); for(int v:adj[u]){ dfs(v,d+1); if(sz(count_by_color[v])>sz(count_by_color[u])) swap(count_by_color[u],count_by_color[v]); for(auto&[key,value]:count_by_color[v]) count_by_color[u][key]+=value; count_by_depth[v].emplace_front(0); if(sz(count_by_depth[v])>sz(count_by_depth[u])) swap(count_by_depth[u],count_by_depth[v]); forn(c,LIMIT) res_by_color[u][c]+=res_by_color[v][c]; forn(h,sz(count_by_depth[v])){ forn(c,LIMIT){ res_by_color[u][c]-=min(count_by_depth[u][h],cnt[c][h+d])+min(count_by_depth[v][h],cnt[c][h+d]); } count_by_depth[u][h]+=count_by_depth[v][h]; forn(c,LIMIT){ res_by_color[u][c]+=min(count_by_depth[u][h],cnt[c][h+d]); } } } int res=l[u]<=LIMIT?res_by_color[u][l[u]]:0; if(l[u]>LIMIT) for(int h:vals[l[u]]){ if(h<d) continue; if(h-d>sz(count_by_depth[u])) break; res+=min(count_by_depth[u][h-d],cnt[l[u]][h]); } int cost=res-count_by_color[u][l[u]]; ans=max(ans,ii{res,-cost}); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>k; forn(i,n) cin>>l[i]; bool flag=true; forsn(i,1,n){ int b; cin>>b; adj[b].pb(i); if(b!=i-1) flag=false; } vi q(k,0); int res=0; dforn(i,n){ res=max(res,++q[l[i]]); } if(flag){ cout<<res<<' '<<0<<'\n'; return 0; } vi colors(k); iota(all(colors),0); sort(all(colors),[&](const int &lhs, const int &rhs){ return q[lhs]>q[rhs]; }); vi pos_by_color(k); forn(i,k) pos_by_color[colors[i]]=i; forn(i,n) l[i]=pos_by_color[l[i]]; dfs0(0); forn(i,k){ sort(all(vals[i])); vals[i].erase(unique(all(vals[i])),end(vals[i])); } dfs(0); cout<<ans.fst<<' '<<-ans.snd<<'\n'; 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...