Submission #960752

#TimeUsernameProblemLanguageResultExecution timeMemory
960752GrindMachineCapital City (JOI20_capital_city)C++17
0 / 100
319 ms39436 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* read the solution a long time ago, remember the solution idea */ const int MOD = 1e9 + 7; const int N = 2e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; vector<int> adj[N]; vector<int> a(N); vector<int> subsiz(N); vector<bool> rem(N); vector<int> par(N); vector<int> nodes; void dfs1(int u, int p){ nodes.pb(u); subsiz[u] = 1; par[u] = p; trav(v,adj[u]){ if(v == p or rem[v]) conts; dfs1(v,u); subsiz[u] += subsiz[v]; } } int dfs2(int u, int p, int nodes){ trav(v,adj[u]){ if(v == p or rem[v]) conts; if(subsiz[v] > nodes/2){ return dfs2(v,u,nodes); } } return u; } vector<int> here[N]; vector<bool> vis(N), done(N); vector<int> tot_cnt(N); int go(int u){ nodes.clear(); dfs1(u,-1); int c = dfs2(u,-1,sz(nodes)); trav(v,nodes){ here[a[v]].pb(v); } queue<int> q; q.push(a[c]); vis[a[c]] = 1; int cols = 0; bool ok = true; while(!q.empty()){ int col = q.front(); q.pop(); cols++; if(sz(here[col]) != tot_cnt[col]){ ok = false; } trav(u,here[col]){ int v = u; while(v != -1 and !done[v]){ if(!vis[a[v]]){ q.push(a[v]); vis[a[v]] = 1; } done[v] = 1; v = par[v]; } } } int ans = inf1; if(ok){ ans = cols-1; } trav(v,nodes){ here[a[v]].clear(); vis[a[v]] = done[v] = 0; } rem[c] = 1; trav(v,adj[c]){ if(rem[v]) conts; amin(ans,go(v)); } return ans; } void solve(int test_case) { int n,k; cin >> n >> k; rep1(i,n-1){ int u,v; cin >> u >> v; adj[u].pb(v), adj[v].pb(u); } rep1(i,n) cin >> a[i]; rep1(i,n) tot_cnt[a[i]]++; int ans = go(1); cout << ans << endl; } int main() { fastio; int t = 1; // cin >> t; rep1(i, t) { solve(i); } 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...