Submission #763889

#TimeUsernameProblemLanguageResultExecution timeMemory
763889jamielimTorrent (COI16_torrent)C++14
100 / 100
753 ms54376 KiB
#include <bits/stdc++.h> using namespace std; #define pb emplace_back #define mp make_pair #define fi first #define se second #define SZ(x) (int)x.size() #define ALL(x) x.begin(),x.end() typedef pair<int,int> ii; typedef long long ll; typedef unsigned long long ull; const int INF=1012345678; const ll LLINF=1012345678012345678LL; const ll MOD=1000000007; int n,a,b; set<int> adj[300005]; int dist[300005]; int dp[300005]; vector<ii> edges; void dfs(int x,int p){ vector<int> v; for(int i:adj[x]){ if(i==p)continue; dfs(i,x); v.pb(dp[i]); } sort(ALL(v)); for(int i=0;i<SZ(v);i++){ dp[x]=max(dp[x],v[i]+SZ(v)-i); } } // remove/add the edge that is x nodes above b in the tree rooted at a void cut_edge(int x){ memset(dp,0,sizeof(dp)); int p=edges[x].fi,q=edges[x].se; adj[p].erase(q); adj[q].erase(p); } void add_edge(int x){ int p=edges[x].fi,q=edges[x].se; adj[p].insert(q); adj[q].insert(p); } int main(){ scanf("%d%d%d",&n,&a,&b); int x,y; for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); adj[x].insert(y); adj[y].insert(x); } for(int i=1;i<=n;i++)dist[i]=INF; dist[a]=0; queue<int> q;q.push(a); while(!q.empty()){ int cur=q.front();q.pop(); for(int i:adj[cur]){ if(dist[i]>dist[cur]+1){ dist[i]=dist[cur]+1; q.push(i); } } } int retrace=b; while(retrace!=a){ for(int i:adj[retrace]){ if(dist[i]==dist[retrace]-1){ edges.pb(i,retrace); retrace=i; break; } } } int l=0,r=dist[b]-1; while(l<r){ int m=(l+r)/2; cut_edge(m); dfs(a,0);dfs(b,0); add_edge(m); if(dp[a]>dp[b])l=m+1; else r=m; } int ans=n-2; if(l>0){ int m=l-1; cut_edge(m); dfs(a,0);dfs(b,0); add_edge(m); ans=min(ans,max(dp[a],dp[b])); } cut_edge(l); dfs(a,0);dfs(b,0); add_edge(l); ans=min(ans,max(dp[a],dp[b])); printf("%d",ans); }

Compilation message (stderr)

torrent.cpp: In function 'int main()':
torrent.cpp:50:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |  scanf("%d%d%d",&n,&a,&b);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~
torrent.cpp:53:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |   scanf("%d%d",&x,&y);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...