이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |