Submission #557879

#TimeUsernameProblemLanguageResultExecution timeMemory
557879600MihneaCapital City (JOI20_capital_city)C++17
100 / 100
621 ms39124 KiB
#include <bits/stdc++.h>

bool home = 1;

using namespace std;

const int N=200000+7;
const int INF=(int)1e9+7;
int n,cntcols,col[N],sub[N],last_active[N],time_step,par[N],last_added[N],tt,print=INF;
vector<int> where_col[N];
vector<int> g[N];
bool blocked[N];
int total;

void build_sub(int a,int p=-1) {
  last_active[a]=time_step;
  sub[a]=1;
  for (auto &b:g[a]) {
    if(b==p||blocked[b]) continue;
    build_sub(b,a);
    sub[a]+=sub[b];
  }
}

int fcen(int a,int p=-1) {
  int mx=total-sub[a];
  for (auto &b:g[a]) {
    if(b==p||blocked[b]) continue;
    mx=max(mx,sub[b]);
  }
  if(mx<=total/2) return a;
  for (auto &b:g[a]) {
    if(b==p||blocked[b]) continue;
    if(sub[b]==mx) return fcen(b,a);
  }
  assert(0);
}

void dfs_par(int a,int p=-1) {
  par[a]=p;
  for (auto &b:g[a]) {
    if(b==p||blocked[b]) continue;
    dfs_par(b,a);
  }
}

void solve(int a) {
  time_step++;
  build_sub(a);
  total=sub[a];

  a=fcen(a);

  queue<int> colors;
  tt++;
  dfs_par(a);

  last_added[col[a]]=tt;
  colors.push(col[a]);
  bool valid=1;
  int sol=0;

  while (!colors.empty()&&valid) {
    int c=colors.front();
    colors.pop();
    for (auto &vertex:where_col[c]) {
      if (last_active[vertex]!=time_step) {
        valid=0;
        break;
      }
      if(vertex==a) continue;
      assert(1<=par[vertex]&&par[vertex]<=n);
      if(last_added[col[par[vertex]]]<tt){
        last_added[col[par[vertex]]]=tt;
        colors.push(col[par[vertex]]);
        sol++;
      }
    }
  }

  if (valid) {
    print=min(print,sol);
  }

  blocked[a]=1;
  for (auto &b:g[a]) {
    if(blocked[b]) continue;
    solve(b);
  }
}

signed main() {
#ifdef ONLINE_JUDGE
  home = 0;
#endif

  home=0;

  if (home) {
    freopen("I_am_iron_man", "r", stdin);
  }
  else {
    ios::sync_with_stdio(0); cin.tie(0);
  }


  cin>>n>>cntcols;
  for (int i=1;i<n;i++) {
    int a,b;
    cin>>a>>b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i=1;i<=n;i++) {
    cin>>col[i];
    where_col[col[i]].push_back(i);
  }
  solve(1);
  cout<<print<<"\n";
}

Compilation message (stderr)

capital_city.cpp: In function 'int main()':
capital_city.cpp:100:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  100 |     freopen("I_am_iron_man", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...