Submission #76449

#TimeUsernameProblemLanguageResultExecution timeMemory
76449MrTEKTorrent (COI16_torrent)C++14
31 / 100
401 ms23072 KiB
#include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define len(a) (int)a.size() #define fi first #define sc second #define d1(w) cerr<<#w<<":"<<w<<endl; #define d2(w,c) cerr<<#w<<":"<<w<<" "<<#c<<":"<<c<<endl; #define d3(w,c,z) cerr<<#w<<":"<<w<<" "<<#c<<":"<<c<<" "<<#z<<":"<<z<<endl; #define left ind+ind #define right ind+ind+1 #define mid (l+r)/2 #define FAST_IO ios_base::sync_with_stdio(false); #define endl '\n' #define bit __builtin_popcount typedef long long int ll; const int maxn = 620; const long long LINF = 1e18; const int LOG = 31; const int INF = 1e9; const int P = 31; const int N = 3e5 + 5; const int M = 1e6 + 5; const int SQ = 350; const int MOD = 1e9 + 7; typedef long long int lli; typedef pair<int,int> pii; vector <pii> ed[N],path; int n,a,b,vis[N],vis2[N],id,h[N],ans = INF; int solve(int cur,int back) { vector <int> v; for (auto i : ed[cur]) if (i.fi != back && h[i.sc] == 0) v.pb(solve(i.fi,cur)); sort(v.begin(),v.end(),greater<int>()); int re = 0,cnt = 0; for (auto i : v) re = max(re,(++cnt) + i); return re; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen(".gir","r",stdin); // freopen(".cik","w",stdout); cin >> n >> a >> b; for (int i = 1 ; i < n ; i++) { int u,v; cin >> u >> v; ed[u].pb(mp(v,++id)); ed[v].pb(mp(u,++id)); } queue <pair< pair <int,int>,int> > Q; Q.push(mp(mp(a,-1),-1)); while(len(Q)) { auto temp = Q.front(); Q.pop(); if (vis[temp.fi.fi]) continue; vis[temp.fi.fi] = temp.fi.sc; vis2[temp.fi.fi] = temp.sc; if (temp.fi.fi == b) { int x = b; while(x != -1) { path.pb(mp(x,vis2[x])); x = vis[x]; } break; } for (auto i : ed[temp.fi.fi]) { Q.push(mp(mp(i.fi,temp.fi.fi),i.sc)); } } reverse(path.begin(),path.end()); int l = 1, r = len(path); ans = n; while(l < r) { auto i = path[mid]; if (i.sc % 2 == 0) h[i.sc] = h[i.sc - 1] = 1; else h[i.sc] = h[i.sc + 1] = 1; int ta = solve(a,-1); int tb = solve(b,-1); ans = min(ans,max(ta,tb)); if (ta <= tb) l = mid + 1; else r = mid; if (i.sc % 2 == 0) h[i.sc] = h[i.sc - 1] = 0; else h[i.sc] = h[i.sc + 1] = 0; } auto i = path[l]; if (i.sc % 2 == 0) h[i.sc] = h[i.sc - 1] = 1; else h[i.sc] = h[i.sc + 1] = 1; ans = min(ans,max(solve(a,-1),solve(b,-1))); if (i.sc % 2 == 0) h[i.sc] = h[i.sc - 1] = 0; else h[i.sc] = h[i.sc + 1] = 0; cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...