이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/**
____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
**/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N_MAX = (int) 1e6;
int N, T, M;
vector <int> adj[N_MAX + 2];
int parent[N_MAX + 2];
int up[N_MAX + 2];
int down[N_MAX + 2];
void dfs (int u) {
int sons = (int) adj[u].size() - (u != T);
int max1 = 0, max2 = 0;
for (int v : adj[u]) {
if (v != parent[u]) {
parent[v] = u;
up[v] = up[u] + (u == T ? 1 : sons);
dfs(v);
if (down[v] >= max1) {
max2 = max1;
max1 = down[v];
} else if (down[v] > max2) {
max2 = down[v];
}
}
}
if (sons == 0) {
down[u] = up[u];
} else if (sons == 1) {
down[u] = up[u] + 1;
} else {
down[u] = max2;
}
}
int path[N_MAX + 2];
int len;
bool check (int answer) {
int block = 0;
for (int i = 1; i <= len; i++) {
int here = 0;
int u = path[i];
for (int v : adj[u]) {
if (v != parent[u] && v != path[i - 1]) {
if (block + down[v] > answer) {
here++;
}
}
}
block += here;
if (block > i) {
return false;
}
}
return (block <= answer);
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> T >> M;
for (int i = 1; i <= N - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(T);
int u = M;
while (u != T) {
path[++len] = u;
u = parent[u];
}
path[++len] = T;
for (int i = 1; i <= len; i++) {
int u = path[i];
for (int v : adj[u]) {
if (v != parent[u] && v != path[i - 1]) {
down[v] -= (len - i) + (i > 1);
}
}
}
int l = 0, r = N;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid) == true) {
r = mid;
} else {
l = mid + 1;
}
}
cout << l << "\n";
return 0;
}
# | 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... |