제출 #216818

#제출 시각아이디문제언어결과실행 시간메모리
216818quocnguyen1012Hard route (IZhO17_road)C++14
52 / 100
2082 ms58680 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back

using namespace std;
typedef long long ll;
typedef pair<int, int> ii;

const int maxn = 5e5 + 5;

vector<int> adj[maxn];
int N;
ii dist[maxn];

void prepare(int u, int p = -1)
{
  dist[u] = mp(0, 0);
  for(int v : adj[u]) if(v != p){
    prepare(v, u);
    int now = dist[v].fi + 1;
    if(dist[u].fi < now){
      dist[u].se = dist[u].fi;
      dist[u].fi = now;
    }
    else if(dist[u].se < now){
      dist[u].se = now;
    }
  }
}

pair<ll, int> dfs(int u, int p = -1, int dep = 0, int mx = 0)
{
  if(adj[u].size() == 1 && p != -1)
    return mp(1ll * dep * mx, 1);
  pair<ll, int> res = mp(0, 0);
  for(int v : adj[u]) if(v != p){
    pair<ll, int> val;
    if(dist[u].fi == dist[v].fi + 1)
      val = dfs(v, u, dep + 1, max(mx, dist[u].se));
    else val = dfs(v, u, dep + 1, max(mx, dist[u].fi));
    if(val.fi > res.fi) res = val;
    else if(val.fi == res.fi) res.se += val.se;
  }
  return res;
}

signed main(void)
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  #ifdef LOCAL
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  #endif // LOCAL
  cin >> N;
  for(int i = 1; i < N; ++i){
    int u, v; cin >> u >> v;
    adj[u].eb(v); adj[v].eb(u);
  }
  pair<ll, int> res = mp(0, 0);
  for(int i = 1; i <= N; ++i){
    if(adj[i].size() == 1){
      prepare(i);
      auto cur = dfs(i);
      if(res.fi < cur.fi) res = cur;
      else if(res.fi == cur.fi) res.se += cur.se;
    }
  }
  cout << res.fi << ' ' << res.se / 2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...