Submission #469144

#TimeUsernameProblemLanguageResultExecution timeMemory
469144ivan_tudorMousetrap (CEOI17_mousetrap)C++14
45 / 100
985 ms67940 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int dp[N]; int h[N]; bool viz[N]; vector<int> gr[N]; int par[N]; void first_dfs(int nod, int dad){ par[nod] = dad; h[nod] = 1 + h[dad]; for(auto x:gr[nod]){ if(x != dad) first_dfs(x, nod); } } void dfs(int nod, int dad){ int nrvec = 0; for(auto x:gr[nod]){ if(x == dad || viz[x] == true) continue; nrvec++; dfs(x, nod); } if(nrvec == 1){ dp[nod] = 1; return; } int m1 = 0, m2 = 0; for(auto x:gr[nod]){ if(x == dad || viz[x]) continue; if(nrvec + dp[x] > m1){ m2 = m1; m1 = nrvec + dp[x]; } else if(nrvec + dp[x] > m2){ m2 = nrvec + dp[x]; } } dp[nod] = m2; } int ans = 0; int sm[N]; set<pair<pair<int, int>, int>> ms; int solve(int nod){ viz[nod] = true; if(par[nod] == 0) return 0; int sum = solve(par[nod]); dfs(nod, 0); ms.insert({{sum + dp[nod], h[nod]}, nod}); sm[nod] = sum + dp[nod]; sum += gr[nod].size() - (par[nod] != 0) - 1; return sum; } void solvefr(int nod){ if(par[nod] == 0) return; ans = max(ans, sm[nod]); ms.erase({{sm[nod], h[nod]}, nod}); if(ms.size()){ int id = (*ms.rbegin()).second; ms.erase(*ms.rbegin()); sm[id] --; ms.insert({{sm[id], h[id]}, id}); } } int main() { //freopen(".in","r",stdin); ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n, root, m; cin>>n>>root>>m; for(int i =1 ; i<n; i++){ int x, y; cin>>x>>y; gr[x].push_back(y); gr[y].push_back(x); } first_dfs(root, 0); solve(m); solvefr(m); cout<<ans; 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...