Submission #584948

#TimeUsernameProblemLanguageResultExecution timeMemory
584948amunduzbaevMousetrap (CEOI17_mousetrap)C++17
45 / 100
822 ms68020 KiB
#include "bits/stdc++.h" using namespace std; #define ar array typedef int64_t ll; //~ #define int long long const int N = 1e6 + 5; vector<int> edges[N]; int n, t, m, dp[N], is[N]; int c[N]; void dfs(int u, int p = -1){ is[u] = (u == t), c[u] = -1; vector<int> t; for(auto x : edges[u]){ if(x == p) continue; dfs(x, u); is[u] |= is[x]; if(!is[x]) t.push_back(x); else c[u] = x; } sort(t.begin(), t.end(), [&](int& i, int& j){ return dp[i] > dp[j]; }); edges[u] = t; if(t.empty()) dp[u] = 0; else { dp[u] = t.size(); if((int)t.size() > 1) dp[u] += dp[t[1]]; } } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>t>>m; assert(t != m); //~ if(t == m){ //~ cout<<0<<"\n"; //~ return 0; //~ } for(int i=1;i<n;i++){ int a, b; cin>>a>>b; edges[a].push_back(b); edges[b].push_back(a); } dfs(m); assert(is[m]); int pos = 0, res = 0; while(m != t){ pos++; vector<int>& t = edges[m]; if(pos >= (int)t.size()){ pos -= (int)t.size(); res += (int)t.size(); } else { res += dp[t[pos]] + (int)t.size(); pos = 1e9; } m = c[m]; } cout<<res<<"\n"; } /* 8 7 1 1 2 2 3 3 4 3 5 3 6 4 7 4 8 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...