Submission #520907

#TimeUsernameProblemLanguageResultExecution timeMemory
520907cig32Mergers (JOI19_mergers)C++17
48 / 100
3095 ms37576 KiB
#include "bits/stdc++.h"
#define int long long
using namespace std;
const int MAXN = 5e5 + 10;
vector<int> adj[MAXN];
vector<int> adj2[MAXN];
int s[MAXN];
int dsu[MAXN];
int set_of(int u) {
  if(dsu[u] == u) return u;
  return dsu[u] = set_of(dsu[u]);
}
void union_(int u, int v) {
  dsu[set_of(u)] = set_of(v);
}
int dfs(int node, int prev, int q) {
  //stat: do the ancestors contain color q
  int cnt = (s[node] == q);
  for(int x: adj[node]) {
    if(x != prev) {
      int d = dfs(x, node, q);
      cnt += d;
      if(d > 0 && set_of(node) != set_of(x)) {
        union_(node, x);
      }
    }
  }
  //ret: how many color q in subtree
  return cnt;
}
int32_t main() {
  int n,k;cin >> n >> k;
  for(int i=1;i<n;i++) {
    int a,b;cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  for(int i=1; i<=n; i++) cin >> s[i];
  for(int i=0; i<=n; i++) dsu[i] = i;
  for(int i=1; i<=k; i++) {
    for(int j=1; j<=n; j++) {
      if(s[j] == i) {
        dfs(j, -1, i);
        break;
      }
    }
  }
  map<pair<int, int>, bool> mp;
  for(int i=1; i<=n; i++) {
    for(int x: adj[i]) {
      if(set_of(i) != set_of(x) && mp[{set_of(i), set_of(x)}] == 0) {
        mp[{set_of(i), set_of(x)}] = 1;
        mp[{set_of(x), set_of(i)}] = 1;
        adj2[set_of(i)].push_back(set_of(x));
        adj2[set_of(x)].push_back(set_of(i));
      }
    }
  }
  int s = 0;
  for(int i=1; i<=n; i++) {
    s += (adj2[i].size() == 1);
  }
  cout << (s + 1) / 2 << "\n";
}

/*
6 5
1 2
2 3
2 4
3 5
2 6
1 5 2 4 2 3 

myAnswer 3

correctAnswer 2
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...