제출 #1276002

#제출 시각아이디문제언어결과실행 시간메모리
1276002m_bezrutchkaHard route (IZhO17_road)C++20
52 / 100
2096 ms56680 KiB
// helping julia_08 debug

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 5e5 + 10;

int dist[MAXN], dp[MAXN];

vector<int> adj[MAXN];

pair<int, int> ans;

void dfs_1(int v, int p){

  dp[v] = 0;

  for(auto u : adj[v]){
    if(u != p){

      dist[u] = dist[v] + 1;
      dfs_1(u, v);

      dp[v] = max(dp[v], dp[u] + 1);

    }
  }

}

void dfs_2(int v, int p, int max_dist){

  if(adj[v].size() == 1 && v != p){

    if(dist[v] * max_dist > ans.first){
      ans = {dist[v] * max_dist, 1};
    } else if(dist[v] * max_dist == ans.first) ans.second ++;

  }

  pair<int, int> max_prof = {0, 0};

  for(auto u : adj[v]){
    if(u != p){
      if(dp[u] + 1 >= max_prof.first){
        max_prof = {dp[u] + 1, max_prof.first};
      } else max_prof.second = max(max_prof.second, dp[u] + 1);
    }
  }

  for(auto u : adj[v]){
    if(u != p){

      int cur_dist = max_prof.first;

      if(dp[u] + 1 == max_prof.first) cur_dist = max_prof.second;

      dfs_2(u, v, max(max_dist, cur_dist));

    }
  }

}

int32_t main(){
  cin.tie(0)->sync_with_stdio(0);

  int n; cin >> n;

  for(int i=1; i<n; i++){
    int a, b; cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }

  for(int i=1; i<=n; i++){
    if(adj[i].size() == 1){

      dist[i] = 0;

      dfs_1(i, i);
      dfs_2(i, i, 0);

    }
  }

  cout << ans.first << " " << ans.second / 2 << "\n";

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...