# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1146417 | SmuggingSpun | Mergers (JOI19_mergers) | C++20 | 32 ms | 19900 KiB |
#include<bits/stdc++.h>
#define taskname "B"
using namespace std;
const int lim = 5e5 + 5;
int n, k, p[lim], vertex[lim], d[lim];
vector<int>g[lim];
int find_set(int N){
while(N != p[N]){
N = p[N] = p[p[N]];
}
return N;
}
void merge(int a, int b){
p[find_set(a)] = find_set(b);
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
cin >> n >> k;
for(int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
memset(vertex, -1, sizeof(vertex));
iota(p + 1, p + n + 1, 1);
for(int i = 1; i <= n; i++){
int x;
cin >> x;
if(vertex[x] == -1){
vertex[x] = i;
}
else{
merge(vertex[x], i);
}
}
int cnt = 0;
memset(d, 0, sizeof(d));
for(int i = 1; i <= n; i++){
for(int& j : g[i]){
if(find_set(i) != find_set(j)){
if(d[find_set(i)]++ == 0){
cnt++;
}
else if(d[find_set(i)] == 2){
cnt--;
}
}
}
}
cout << ((cnt + 1) >> 1);
}
Compilation message (stderr)
# | 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... |