This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pii pair<int, int>
#define ti3 tuple<int, int, int>
#define ti4 tuple<int, int, int, int>
#define int long long
// Honestly, I love you, to the mysterious (SinB) place ~ SinB, Sunny Summer
using namespace std;
int p[500005];
int fs(int x){
if (p[x] == x) return x;
else return p[x] = fs(p[x]);
}
bool ss(int x, int y){
return fs(x) == fs(y);
}
void ms(int x, int y){ // x <- y
if (ss(x, y)) return;
p[fs(y)] = fs(x);
}
vector<int> adjlist[500005];
int tpar[500005], dep[500005];
void dfs(int x, int p, int d){
tpar[x] = p;
dep[x] = d;
for (auto i : adjlist[x]){
if (i == p) continue;
dfs(i, x, d+1);
}
}
int prvState[500005], deg[500005];
main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int n, k; cin >> n >> k;
for (int i = 0; i < n - 1; i++){
int a, b; cin >> a >> b;
adjlist[a].push_back(b);
adjlist[b].push_back(a);
}
dfs(1, -1, 0);
iota(p, p+n+2, 0);
for (int i = 1; i <= n; i++){
int x; cin >> x;
if (prvState[x]){
int a = fs(i), b = fs(prvState[x]);
while (!ss(a, b)){
if (dep[a] > dep[b]) swap(a, b);
ms(tpar[b], b);
b = fs(b);
}
}
prvState[x] = i;
}
for (int i = 1; i <= n; i++){
for (auto j : adjlist[i]){
if (!ss(i, j)) deg[fs(i)]++;
}
}
int cnt = 0;
for (int i = 1; i <= n; i++){
if (deg[i] == 1) cnt++;
}
cout << (cnt + 1) / 2 << endl;
}
Compilation message (stderr)
mergers.cpp:31:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
31 | main(){
| ^~~~
# | 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... |