# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
467354 | phathnv | Pastiri (COI20_pastiri) | C++17 | 1010 ms | 194744 KiB |
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>
using namespace std;
const int N = 500007;
int n, k, sheep[N], h[N], d[N], trace[N], numNode;
pair<int, int> best[2 * N];
vector<int> adj[N], child[2 * N];
bool vst[N];
int main() {
scanf("%d %d", &n, &k);
for (int i = 1; i < n; i++) {
int u, v;
scanf("%d %d", &u, &v);
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i = 1; i <= k; i++)
scanf("%d", &sheep[i]);
queue<int> qu;
h[1] = 1;
qu.push(1);
while (!qu.empty()) {
int u = qu.front();
qu.pop();
for (int v : adj[u])
if (!h[v]) {
h[v] = h[u] + 1;
qu.push(v);
}
}
for (int i = 1; i <= k; i++) {
int x = sheep[i];
++numNode;
trace[x] = numNode;
d[x] = 1;
qu.push(x);
}
while (!qu.empty()) {
int u = qu.front();
qu.pop();
for (int v : adj[u]) {
if (!d[v]) {
trace[v] = trace[u];
d[v] = d[u] + 1;
qu.push(v);
} else if (d[v] == d[u] + 1) {
int newNode = ++numNode;
child[newNode].push_back(trace[u]);
child[newNode].push_back(trace[v]);
trace[v] = newNode;
}
}
}
for (int u = 1; u <= numNode; u++) {
if (u <= k)
best[u] = {h[sheep[u]], 0};
else
best[u] = {1e9, 0};
for (int v : child[u]) {
best[u] = min(best[u], best[v]);
vst[v] = true;
}
best[u].second = u;
}
for (int u = 1; u <= numNode; u++)
if (vst[u]) {
best[u] = {1e9, 1e9};
vst[u] = false;
}
for (int u = numNode; u >= 1; u--) {
for (int v : child[u])
best[v] = min(best[v], best[u]);
}
vector<int> ord(k);
iota(ord.begin(), ord.end(), 1);
sort(ord.begin(), ord.end(), [&](const int &a, const int &b){
return h[sheep[a]] > h[sheep[b]];
});
map<int, int> nodeToVex;
for (int i = 1; i <= n; i++)
nodeToVex[trace[i]] = i;
vector<int> answer;
for (int x : ord) {
if (vst[x])
continue;
queue<int> qu;
qu.push(best[x].second);
answer.push_back(nodeToVex[best[x].second]);
while (!qu.empty()) {
int u = qu.front();
qu.pop();
if (vst[u])
continue;
vst[u] = true;
for (int v : child[u])
qu.push(v);
}
}
printf("%d\n", answer.size());
for (int x : answer)
printf("%d ", x);
}
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... |