Submission #593514

#TimeUsernameProblemLanguageResultExecution timeMemory
593514alextodoranMousetrap (CEOI17_mousetrap)C++17
25 / 100
687 ms68048 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; multiset <pair <int, int>> s; int maxDown[N_MAX + 2]; int block[N_MAX + 2]; 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 = len; i >= 1; i--) { int u = path[i]; for (int v : adj[u]) { if (v != parent[u] && v != path[i + 1]) { s.insert(make_pair(down[v] - (len - i), i)); } } if (s.empty() == false && prev(s.end())->first > maxDown[i + 1] + 1) { multiset <pair <int, int>> :: iterator it = prev(s.end()); block[it->second]++; s.erase(it); } maxDown[i] = (s.empty() == false ? prev(s.end())->first : 0); } int answer = 0, useless = 0; for (int i = 1; i <= len; i++){ answer = max(answer, maxDown[i]); useless += block[i]; } cout << answer << "\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...