제출 #593497

#제출 시각아이디문제언어결과실행 시간메모리
593497alextodoranMousetrap (CEOI17_mousetrap)C++17
0 / 100
721 ms81180 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, bool below = false) { up[u] += below; 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] + max(0, sons - 1); dfs(v, (below == true || u == M)); 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 = 1; i <= len; i++) { int u = path[i]; for (int v : adj[u]) { if (v != parent[u] && v != path[i - 1]) { s.insert(make_pair(down[v], i)); } } if (s.empty() == false) { 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; int aux = 0; for (int i = 1; i <= len; i++) { answer = max(answer, maxDown[i] + aux); aux += 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...