Submission #1272231

#TimeUsernameProblemLanguageResultExecution timeMemory
1272231danglayloi1Capital City (JOI20_capital_city)C++20
0 / 100
311 ms39824 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define fi first #define se second #define inf 0x3f3f3f3f using namespace std; using ll = long long; const ll mod=1e9+7; const int nx=2e5+5; int n, k, sz[nx], par[nx], id[nx], cnt[nx], ans=inf; vector<int> adj[nx], ve, sam, col[nx]; bool del[nx], vis[nx]; int go(int p, int u) { sz[u]=1; for(int v:adj[u]) if(v!=p && !del[v]) sz[u]+=go(u, v); return sz[u]; } int centroid(int p, int u, int tre) { for(int v:adj[u]) if(v!=p && !del[v] && sz[v]>tre/2) return centroid(u, v, tre); return u; } void dfs(int p, int u, int val) { par[u]=p; cnt[id[u]]++; ve.emplace_back(u); if(id[u]==val) sam.emplace_back(u); for(int v:adj[u]) if(v!=p && !del[v]) dfs(u, v, val); } void build(int u) { int root=centroid(0, u, go(0, u)); dfs(0, u, id[root]); if(cnt[id[root]]==(int)col[id[root]].size()) { int dem=0; vis[id[root]]=1; bool ok=1; while(sam.size()) { int x=par[sam.back()]; sam.pop_back(); if(x>0 && !vis[id[x]]) { if(cnt[id[x]]<(int)col[id[x]].size()) { ok=0; break; } dem++; vis[id[x]]=1; for(int y:col[id[x]]) sam.emplace_back(y); } } if(ok) ans=min(ans, dem); } for(int x:ve) vis[id[x]]=0, cnt[id[x]]=0; sam.clear(); ve.clear(); del[root]=1; for(int v:adj[root]) if(!del[v]) build(v); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k; for(int i = 1; i < n; i++) { int u, v; cin>>u>>v; adj[u].emplace_back(v); adj[v].emplace_back(u); } for(int i = 1; i <= n; i++) cin>>id[i], col[id[i]].emplace_back(i); build(1); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...