Submission #225216

#TimeUsernameProblemLanguageResultExecution timeMemory
225216quocnguyen1012Capital City (JOI20_capital_city)C++14
100 / 100
982 ms40936 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define ar array

using namespace std;
typedef long long ll;
typedef pair<int, int> ii;

const int maxn = 2e5 + 5, inf = 1e9;

int N, K;
vector<int> same[maxn], adj[maxn];
int sz[maxn], del[maxn], vis[maxn], cvis[maxn], col[maxn], par[maxn];
vector<int> vec;
int ret = inf, num[maxn];

void prepare(int u, int p)
{
  vec.pb(col[u]);
  par[u] = p;
  same[col[u]].pb(u);
  vis[u] = cvis[col[u]] = 0;
  for(int v : adj[u]) if(v != p && !del[v]){
    prepare(v, u);
  }
}

void findsz(int u, int p)
{
  sz[u] = 1;
  for(int v : adj[u]) if(v != p && !del[v]){
    findsz(v, u);
    sz[u] += sz[v];
  }
}

int findcen(int u, int p, int siz)
{
  for(int v : adj[u]) if(v != p && !del[v]){
    if(sz[v] > siz / 2) return findcen(v, u, siz);
  }
  return u;
}

void decomp(int u)
{
  findsz(u, u);
  u = findcen(u, u, sz[u]);
  prepare(u, u);
  del[u] = true;

  queue<int> q;
  q.push(col[u]);
  cvis[col[u]] = true;
  int cnt = 0;
  while(q.size()){
    int c = q.front(); q.pop();
    ++cnt;
    for(int v : same[c]){
      while(!vis[v]){
        vis[v] = true;
        if(!cvis[col[v]]){
          cvis[col[v]] = true;
          q.push(col[v]);
        }
        v = par[v];
      }
    }
  }
  bool flag = true;
  for(int c : vec){
    if(cvis[c] && num[c] != same[c].size())
      flag = false;
  }
  //cerr << u << ' ' << cnt << '\n';
  if(flag)
    ret = min(ret, cnt - 1);
  for(int c : vec)
    same[c].clear();
  vec.clear();
  for(int v : adj[u])
    if(!del[v])
      decomp(v);
}

signed main(void)
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  #ifdef LOCAL
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  #endif // LOCAL
  cin >> N >> K;
  for(int i = 1; i < N; ++i){
    int u, v; cin >> u >> v;
    adj[u].eb(v); adj[v].eb(u);
  }
  for(int i = 1; i <= N; ++i){
    cin >> col[i];
    ++num[col[i]];
  }
  decomp(1);
  cout << ret;
}

Compilation message (stderr)

capital_city.cpp: In function 'void decomp(int)':
capital_city.cpp:77:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(cvis[c] && num[c] != same[c].size())
                   ~~~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...