Submission #1045468

#TimeUsernameProblemLanguageResultExecution timeMemory
1045468aintaTeam Coding (EGOI24_teamcoding)C++17
100 / 100
996 ms62424 KiB
#include <bits/stdc++.h> using namespace std; #define rng(i,a,b) for(int i=int(a);i<=int(b);i++) #define rep(i,b) rng(i,0,b-1) #define gnr(i,b,a) for(int i=int(b);i>=int(a);i--) #define per(i,b) gnr(i,b-1,0) #define pb push_back #define eb emplace_back #define fi first #define se second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #define si(x) int(x.size()) template<class t> using vc=vector<t>; template<class t> using vvc=vc<vc<t>>; typedef long long ll; using pii=pair<int,int>; using vi=vc<int>; using uint=unsigned; using ull=unsigned long long; using pil=pair<int,ll>; using pli=pair<ll,int>; using pll=pair<ll,ll>; using t3=tuple<int,int,int>; #define N_ 110000 vi E[N_], G[N_]; int n, K; const int BL = 200; int w[N_], Dep[N_], Num[N_], cnt, Ed[N_], Rev[N_]; int Left[N_], Right[N_], Ans, Ans2, T1[N_], T2[N_]; map<int,int>C[N_]; void DFS(int a){ Num[a] = ++cnt; for(auto &x:E[a]){ Dep[x]=Dep[a]+1; DFS(x); } Ed[a] = ++cnt; } void Do1(int a){ int pv = -1, Mx = -1; for(auto &x:E[a]){ Do1(x); if(Mx < si(C[x])){ pv = x; Mx = si(C[x]); } } if(pv!=-1){ swap(C[a],C[pv]); } C[a][Dep[a]]+=1; for(auto &x:E[a]){ if(x==pv)continue; for(auto &[d,c] : C[x]) C[a][d] += c; } if(si(G[w[a]]) < BL){ for(auto &t: G[w[a]]){ T1[Dep[t]]++; if(Num[a] <= Num[t] && Num[t] <= Ed[a]){ T2[Dep[t]]++; } } int s = 0, s2 = 0; for(auto &t: G[w[a]]){ int d = Dep[t]; if(!T1[d])continue; int c = C[a][d]; s += min(T1[d], c); s2 += min(T2[d],c); T1[d]=T2[d]=0; } if(Ans < s || (Ans==s && Ans2 > s-s2)){ Ans = s; Ans2 = s-s2; } } } int DMX, CC[N_], s2; void Go(int a, int col){ int d = Dep[a]; CC[d]++; DMX = max(DMX, d); if(w[a]==col)s2++; for(auto &x: E[a]){ Go(x,col); } } void Do2(int a, int col){ if(w[a]==col){ DMX = Dep[a]; s2=0; Go(a, col); int s=0; rng(i,Dep[a],DMX){ s += min(CC[i],T1[i]); CC[i]=0; } if(Ans < s || (Ans==s && Ans2 > s-s2)){ Ans = s; Ans2 = s-s2; } return; } for(auto &x : E[a]){ Do2(x, col); } } int main(){ scanf("%d%d",&n,&K); rep(i,n){ scanf("%d",&w[i]); G[w[i]].pb(i); } rng(i,1,n-1){ int a; scanf("%d",&a); E[a].pb(i); } DFS(0); Do1(0); rep(i,K){ if(si(G[i]) >= BL){ for(auto &u: G[i])T1[Dep[u]]++; Do2(0,i); for(auto &u: G[i])T1[Dep[u]]--; } } printf("%d %d\n",Ans,Ans2); }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:116:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  116 |     scanf("%d%d",&n,&K);
      |     ~~~~~^~~~~~~~~~~~~~
Main.cpp:118:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |         scanf("%d",&w[i]);
      |         ~~~~~^~~~~~~~~~~~
Main.cpp:123:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         scanf("%d",&a);
      |         ~~~~~^~~~~~~~~
#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...