제출 #593866

#제출 시각아이디문제언어결과실행 시간메모리
593866alextodoranMousetrap (CEOI17_mousetrap)C++17
25 / 100
685 ms67984 KiB
/** ____ ____ ____ ____ ____ ||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] + 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 true; } 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...