제출 #366398

#제출 시각아이디문제언어결과실행 시간메모리
366398KazalikaMergers (JOI19_mergers)C++14
100 / 100
1573 ms226828 KiB
#include <bits/stdc++.h>
using namespace std;
 
const int N = 5e5 + 5;
 
int n, k, s[N], cnt[N];
 
vector<int> g[N];
 
int ptr[N];
map<int, int> mp[N];
int comp[N], deg[N];
 
int gptr(int v) {
  if (v == ptr[v])
    return v;
  return ptr[v] = gptr(ptr[v]);
}
 
void merge(int a, int b) {
  a = gptr(a), b = gptr(b);
  if (mp[a].size() > mp[b].size())
    swap(a, b);
  ptr[a] = b;
  for (auto &p : mp[a]) {
    mp[b][p.first] += p.second;
    if (mp[b][p.first] == cnt[p.first])
      comp[b]++;
  }
}
 
vector<pair<int, int>> gd;
 
void go(int v, int p = -1) {
  ptr[v] = v;
  mp[ptr[v]][s[v]]++;
  if (cnt[s[v]] == 1)
    comp[ptr[v]]++;
  for (int u : g[v]) {
    if (u == p)
      continue;
    go(u, v);
    if (comp[gptr(u)] == mp[gptr(u)].size()) {
      deg[v]++;
      deg[u]++;
    } else
      gd.emplace_back(v, u);
    merge(v, u);
  }
}
 
int par[N], sm[N], rnk[N];
 
int gpar(int a) {
  if (a == par[a])
    return a;
  return par[a] = gpar(par[a]);
}
void mrg(int a, int b) {
  a = gpar(a), b = gpar(b);
  if (a == b)
    return;
  if (rnk[a] > rnk[b])
    swap(a, b);
  rnk[b]++;
  par[a] = b;
}
 
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> k;
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
    cnt[s[i]]++;
  }
  go(0);
  iota(par, par + n, 0);
  for (auto &e : gd)
    mrg(e.first, e.second);
  for (int i = 0; i < n; ++i)
    sm[gpar(i)] += deg[i];
  int res = 0;
  for (int i = 0; i < n; ++i)
    if (sm[i] == 1)
      res++;
  cout << (res + 1) / 2;
}

컴파일 시 표준 에러 (stderr) 메시지

mergers.cpp: In function 'void go(int, int)':
mergers.cpp:43:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::map<int, int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     if (comp[gptr(u)] == mp[gptr(u)].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...
#Verdict Execution timeMemoryGrader output
Fetching results...