Submission #1182925

#TimeUsernameProblemLanguageResultExecution timeMemory
1182925FaresSTHHard route (IZhO17_road)C++20
19 / 100
2095 ms15424 KiB
#include"bits/stdc++.h" using namespace std; using ll=long long; #define S second #define F first const int mxn=6e5; int p[mxn][30],d[mxn],mx,x; vector<int>adj[mxn]; void dfs(int i){ d[i]=d[p[i][0]]+1; for(int j:adj[i]){ if(j==p[i][0])continue; p[j][0]=i; dfs(j); } } void diamiter(int i,int p,int l){ for(int j:adj[i]){ if(j==p)continue; diamiter(j,i,l+1); } if(l>mx){ mx=l; x=i; } } pair<int,int>dis(int a,int b){ int res=0; if(d[a]>d[b]){ for(int i=25;i>=0;i--){ if(d[p[a][i]]>d[b])a=p[a][i],res+=(1<<i); } a=p[a][0]; res++; } if(d[b]>d[a]){ for(int i=25;i>=0;i--){ if(d[p[b][i]]>d[a])b=p[b][i],res+=(1<<i); } b=p[b][0]; res++; } if(a==b)return {res,a}; for(int i=25;i>=0;i--){ if(p[a][i]!=p[b][i])a=p[a][i],b=p[b][i],res+=(1ll<<(i+1)); } res++,res++; return {res,p[a][0]}; } int pwease(int a,int b){ if(a==b)return 0; int res=1; for(int i=25;i>=0;i--){ if(d[p[a][i]]>d[b])a=p[a][i],res+=(1<<i); } return res; } int main(){ cin.tie(0)->sync_with_stdio(0); int n; cin>>n; for(int i=1,a,b;i<n;i++){ cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } bool f=1; int st; for(int i=1;i<=n;i++){ if((int)adj[i].size()>2)f=0,st=i; } if(f)return cout<<"0 1",0; dfs(st); for(int j=1;j<=25;j++){ for(int i=1;i<=n;i++){ p[i][j]=p[p[i][j-1]][j-1]; } } diamiter(1,0,0); vector<int>sigma_7aly={x}; diamiter(x,0,0); sigma_7aly.push_back(x); pair<ll,ll>res={0,0}; int cournt=-1; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if((int)adj[i].size()>1||(int)adj[j].size()>1)continue; ll cur=0; bool f=1; for(int k:sigma_7aly){ if(k==i||k==j)continue; f=0; int a=pwease(i,dis(i,j).S),b=pwease(i,dis(i,k).S); int mn=ll(dis(i,k).F-min(a,b)); a=pwease(j,dis(i,j).S),b=pwease(j,dis(j,k).S); mn=min(mn,dis(j,k).F-min(a,b)); cur=max(cur,ll(mn)); } if(f){ if(cournt!=-1)cur=cournt; else{ for(int k=1;k<=n;k++){ if((int)adj[k].size()>1||k==i||k==j)continue; int a=pwease(i,dis(i,j).S),b=pwease(i,dis(i,k).S); int mn=ll(dis(i,k).F-min(a,b)); a=pwease(j,dis(i,j).S),b=pwease(j,dis(j,k).S); mn=min(mn,dis(j,k).F-min(a,b)); cur=max(cur,ll(mn)); } cournt=cur; } } cur*=dis(i,j).F; if(cur>res.F)res={cur,1}; else if(cur==res.F)res.S++; } } cout<<res.F<<' '<<res.S; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...