Submission #1050248

#TimeUsernameProblemLanguageResultExecution timeMemory
1050248hotboy2703Capital City (JOI20_capital_city)C++17
100 / 100
141 ms53768 KiB
#include<bits/stdc++.h> using ll = long long; using namespace std; #define pll pair <ll,ll> #define fi first #define se second #define MP make_pair #define sz(a) (ll((a).size())) #define BIT(mask,i) (((mask) >> (i))&1) #define MASK(i) (1LL << (i)) const ll MAXN = 2e5+100; vector <ll> g[MAXN]; ll in[MAXN],out[MAXN],timeDFS; ll c[MAXN]; ll n,k; vector <ll> color[MAXN]; namespace SCC{ vector <ll> edge[MAXN]; vector <ll> rev[MAXN]; bool in[MAXN]; void add(ll x,ll y){ // cout<<x<<' '<<y<<'\n'; edge[x].push_back(y); rev[y].push_back(x); } void dfs(ll u,vector <ll> gg[],vector <ll> &comp){ in[u] = 1; for (auto v:gg[u]){ if (!in[v]){ dfs(v,gg,comp); } } comp.push_back(u); } ll solve(){ vector <ll> order; for (ll i = 1;i <= k;i ++){ if (!in[i]){ dfs(i,edge,order); } } memset(in,0,sizeof in); reverse(order.begin(),order.end()); ll res = k; for (auto x:order){ if (!in[x]){ vector <ll> comp; dfs(x,rev,comp); bool ok = 1; for (auto x:comp){ for (auto y:edge[x]){ if (!in[y]){ok=0;} } } if (ok && sz(comp) < res){ res = sz(comp); } } } return res; } } void dfs(ll u,ll p){ in[u] = ++timeDFS; color[c[u]].push_back(in[u]); for (auto v:g[u]){ if (v==p)continue; dfs(v,u); } out[u] = timeDFS; } int main(){ ios_base::sync_with_stdio(0);cin.tie(nullptr); cin>>n>>k; for (ll i = 1;i < n;i ++){ ll u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } for (ll i = 1;i <= n;i ++)cin>>c[i]; dfs(1,1); for (ll i = 1;i <= n;i ++){ for (auto v:g[i]){ if (c[v] != c[i]){ if (in[v] > in[i]){ auto tmp = lower_bound(color[c[i]].begin(),color[c[i]].end(),in[v]); if (tmp!=color[c[i]].end() && (*tmp) <= out[v]){ SCC::add(c[i],c[v]); } } else{ auto tmp = upper_bound(color[c[i]].begin(),color[c[i]].end(),out[i]) - lower_bound(color[c[i]].begin(),color[c[i]].end(),in[i]); if (tmp != sz(color[c[i]]))SCC::add(c[i],c[v]); } } } } cout<<SCC::solve()-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...