Submission #596782

#TimeUsernameProblemLanguageResultExecution timeMemory
5967821binMousetrap (CEOI17_mousetrap)C++14
100 / 100
864 ms166320 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(), v.end() typedef long long ll; const int NMAX = 1e6 + 5; int n, t, m, u, v, d, dp[NMAX], inP[NMAX]; vector<int> adj[NMAX], P; int dfs(int x, int p){ int ret = x == m; for(int nx : adj[x]){ if(nx == p) continue; ret |= dfs(nx, x); } if(ret) P.emplace_back(x), inP[x] = 1; return ret; } void dfs2(int x, int p){ int deg, mx1, mx2, t; deg = mx1 = mx2 = 0; for(int nx : adj[x]){ if(nx == p) continue; dfs2(nx, x); deg++; t = dp[nx]; if(t > mx2) mx2 = t; if(mx2 > mx1) swap(mx1, mx2); } dp[x] = mx2 + deg; return; } int go(int m){ int cnt = 0, b = 0, deg = d; for(int p : P){ int t = 0; cnt++; for(int x: adj[p]) { if(inP[x]) continue; if(dp[x] + deg > m) b++; else t++; } if(b > cnt) return 0; deg -= t; } return 1; } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> t >> m; for(int i = 0; i < n - 1; i++){ cin >> u >> v; adj[u].emplace_back(v); adj[v].emplace_back(u); } dfs(t, -1); P.pop_back(); for(int p : P) for(int x : adj[p]) if(!inP[x]) dfs2(x, p), d++; int l = d, r = 2 * n; while(l < r){ int m = (l + r) >> 1; if(go(m)) r = m; else l = m + 1; } cout << l; 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...