Submission #1157619

#TimeUsernameProblemLanguageResultExecution timeMemory
1157619nrg_studioTorrent (COI16_torrent)C++20
100 / 100
221 ms22368 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pii pair<int,int> #define f first #define s second #define chmin(a, b) a = min(a,b) #define chmax(a, b) a = max(a,b) #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define F0R(i, a) for (int i = 0; i < (a); i++) #define all(x) x.begin(),x.end() #define v vector const int MAX_N = 3e5; v<int> adj[MAX_N]; v<int> path; int a, b; bool find_path(int cur, int par) { for (int x : adj[cur]) { if (x!=par) { path.pb(x); if (find_path(x,cur)) { return true; } else { path.pop_back(); } } } return (cur==b); } int dfs(int cur, int par, int p) { v<int> dp; for (int x : adj[cur]) { if (x!=par && x!=p) { dp.pb(dfs(x,cur,p)); } } int ret = 0; sort(all(dp),greater<>()); for (int i=0;i<dp.size();i++) { ret = max(ret,dp[i]+i+1); } return ret; } pair<int,int> check(int p) { return make_pair(dfs(a,-1,path[p]),dfs(b,-1,path[p-1])); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n >> a >> b; a--; b--; path.pb(a); for (int i=0;i<n-1;i++) { int c, d; cin >> c >> d; adj[--c].pb(--d); adj[d].pb(c); } find_path(a,-1); int lo = 1, hi = path.size()-1, mid = (lo+hi)/2, ans = path.size()-1; while (lo <= hi) { pii res = check(mid); if (res.f >= res.s) { ans = mid; hi = mid-1; } else {lo = mid+1;} mid = (lo+hi)/2; } pii cand1 = check(ans), cand2 = (ans==0 ? make_pair(INT_MAX,INT_MAX) : check(ans-1)); cout << min(max(cand1.f,cand1.s),max(cand2.f,cand2.s)) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...