Submission #1184452

#TimeUsernameProblemLanguageResultExecution timeMemory
118445212345678Unique Cities (JOI19_ho_t5)C++20
100 / 100
421 ms32836 KiB
#include <bits/stdc++.h> using namespace std; const int nx=2e5+5; int n, m, u, v, c[nx], lvl[nx], dn[nx], ans[nx], rt, f[nx], cnt; vector<int> d[nx]; pair<int, int> mx; stack<int> s; void add(int u) { s.push(u); if (f[c[u]]++==0) cnt++; } void rem() { if (--f[c[s.top()]]==0) cnt--; s.pop(); } void dfslvl(int u, int p) { if (u==p) lvl[u]=0; else lvl[u]=lvl[p]+1; for (auto v:d[u]) if (v!=p) dfslvl(v, u); } void dfsdn(int u, int p) { dn[u]=0; for (auto v:d[u]) if (v!=p) dfsdn(v, u), dn[u]=max(dn[u], dn[v]+1); } void solve(int u, int p) { //cout<<"in "<<u<<' '<<cnt<<' '<<s.size()<<'\n'; int smx=0; pair<int, int> hv={0, 0}; for (auto v:d[u]) if (v!=p) hv=max(hv, {dn[v]+1, v}); for (auto v:d[u]) if (v!=p&&v!=hv.second) smx=max(smx, dn[v]+1); //cout<<"hv "<<hv.first<<' '<<hv.second<<'\n'; if (hv.second) { while (!s.empty()&&lvl[s.top()]>=lvl[u]-smx) rem(); add(u); solve(hv.second, u); if (!s.empty()&&s.top()==u) rem(); while (!s.empty()&&lvl[s.top()]>=lvl[u]-hv.first) rem(); for (auto v:d[u]) { if (v==p||v==hv.second) continue; add(u); solve(v, u); if (!s.empty()&&s.top()==u) rem(); } } //cout<<"u "<<u<<' '<<s.size()<<'\n'; //if (!s.empty()) cout<<"here "<<s.top()<<'\n'; ans[u]=max(ans[u], cnt); } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>m; for (int i=1; i<n; i++) cin>>u>>v, d[u].push_back(v), d[v].push_back(u); for (int i=1; i<=n; i++) cin>>c[i]; dfslvl(1, 1); for (int i=1; i<=n; i++) mx=max(mx, {lvl[i], i}); rt=mx.second; mx={0, 0}; dfslvl(rt, rt); dfsdn(rt, rt); solve(rt, rt); //cout<<"debug "<<cnt<<'\n'; for (int i=1; i<=n; i++) mx=max(mx, {lvl[i], i}); rt=mx.second; mx={0, 0}; dfslvl(rt, rt); dfsdn(rt, rt); solve(rt, rt); for (int i=1; i<=n; i++) cout<<ans[i]<<'\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...