Submission #1159300

#TimeUsernameProblemLanguageResultExecution timeMemory
1159300nh0902Torrent (COI16_torrent)C++20
100 / 100
328 ms23568 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N = 3e5 + 10; const int M = 1e4; const long long inf = 1e17; int n; vector<int> g[N]; int x, y; int m, path[N]; // path from x to y bool dfs(int u, int p, int d) { if (u == y) { path[d] = y; m = d; return true; } for (int v : g[u]) if (v != p) { if (dfs(v, u, d + 1)) { path[d] = u; return true; } } return false; } int dp[N]; void DFS(int u, int p, int b) { vector<int> s; for (int v : g[u]) if (v != p && v != b) { DFS(v, u, b); s.push_back(dp[v]); } sort(s.begin(), s.end()); int k = s.size(); for (int i = 0; i < k; i ++) { dp[u] = max(dp[u], s[i] + k - i); } } int solve(int i) { memset(dp, 0, sizeof dp); DFS(x, x, path[i + 1]); DFS(y, y, path[i]); return max(dp[x], dp[y]); } int main() { //ios_base::sync_with_stdio(0); //cin.tie(0); //cout.tie(0); cin >> n >> x >> y; int u, v; for (int i = 1; i < n; i ++) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(x, x, 1); int l = 1; int r = m - 1; while (l < r) { int mid = (l + r) / 2; solve(mid + 1); if (dp[x] <= dp[y]) l = mid + 1; else r = mid; } int ans = solve(l); if (l < m - 1) ans = min(ans, solve(l + 1)); cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...