Submission #1294322

#TimeUsernameProblemLanguageResultExecution timeMemory
1294322PiokemonUnique Cities (JOI19_ho_t5)C++20
100 / 100
368 ms33932 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; constexpr int N = 2e5; int a[N+9]; vector<int> graf[N+9]; int ans[N+9]; int cnt[N+9]; vector<pair<int,int>> stos; int dpt[N+9]; int maxdpt[N+9]; int terans=0; void add(int v){ if (!cnt[a[v]]){ terans++; } stos.push_back({dpt[v],v}); cnt[a[v]]++; } void usun(){ if (stos.empty())return; int v=stos.back().second; stos.pop_back(); cnt[a[v]]--; if (cnt[a[v]]==0)terans--; } void dfs1(int v, int p){ maxdpt[v]=dpt[v]; for (int x:graf[v]){ if (x==p)continue; dpt[x]=dpt[v]+1; dfs1(x,v); maxdpt[v]=max(maxdpt[v],maxdpt[x]); } } void calc(int v, int p){ pair<int,int> maks={0,0}; for (int x:graf[v]){ if (x==p)continue; int te=x; if (maxdpt[maks.first]<maxdpt[te])swap(te,maks.first); if (maxdpt[maks.second]<maxdpt[te])swap(te,maks.second); } if (maks.first==0){ans[v]=max(ans[v],terans);return;} if (maks.second==0){ add(v); calc(maks.first,v); int minidpt=dpt[v] - (maxdpt[maks.first]-dpt[v]); while (!stos.empty() && stos.back().first>=minidpt)usun(); ans[v]=max(ans[v],terans); return; } int minidpt = dpt[v] - (maxdpt[maks.second]-dpt[v]); while (!stos.empty() && stos.back().first>=minidpt)usun(); add(v); calc(maks.first,v); minidpt=dpt[v] - (maxdpt[maks.first]-dpt[v]); while (!stos.empty() && stos.back().first>=minidpt)usun(); for (int x:graf[v]){ if (x==p || x==maks.first)continue; add(v); calc(x,v); } while(!stos.empty() && stos.back().first>=dpt[v])usun(); ans[v]=max(ans[v],terans); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k,u,b; cin >> n >> k; for (int x=1;x<n;x++){ cin >> u >> b; graf[u].push_back(b); graf[b].push_back(u); } for (int x=1;x<=n;x++) cin >> a[x]; dfs1(1,-1); int l=1,r=1; for (int x=1;x<=n;x++){ ans[x]=0; if (dpt[x]>dpt[l])l=x; } dpt[l]=0; dfs1(l,-1); calc(l,-1); while(!stos.empty())usun(); for (int x=1;x<=n;x++){ if (dpt[x]>dpt[r])r=x; } dpt[r]=0; dfs1(r,-1); calc(r,-1); for (int x=1;x<=n;x++) cout << ans[x] << '\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...