Submission #1116775

#TimeUsernameProblemLanguageResultExecution timeMemory
1116775kfhjadHard route (IZhO17_road)C++17
0 / 100
5 ms13816 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> adj[500001]; int up[500001], down[500001]; ll ans = 0; int freq = 1; void dfs(int node, int p) { for (int i : adj[node]) { if (i == p) continue; dfs(i, node); down[node] = max(down[node], down[i] + 1); } } void dfs1(int node, int p) { ll m1 = 0, m2 = 0, m3 = 0; for (int i : adj[node]) { if (i == p) continue; if (down[i] + 1 > m3) m3 = down[i] + 1; if (m3 > m2) swap(m3, m2); if (m2 > m1) swap(m2, m1); } if (up[node] > m3) m3 = up[node]; if (m3 > m2) swap(m3, m2); if (m2 > m1) swap(m2, m1); for (int i : adj[node]) { if (i == p) continue; if (down[i] + 1 == m1) up[i] = max((ll)up[node], m2) + 1; else up[i] = max((ll)up[node], m1) + 1; if (down[i] + 1 == m1 && adj[node].size() > 2) { ll x = (m2 + m3) * m1; if (x > ans) ans = x, freq = 1; else if (x == ans) ++freq; } dfs1(i, node); } if (up[node] == m1 && adj[node].size() > 2 && node != 1) { ll x = (m2 + m3) * m1; if (x > ans) ans = x, freq = 1; else if (x == ans) ++freq; } // cout << m1 << ' ' << m2 << ' ' << m3 << endl; } int main() { cin.tie(NULL) -> sync_with_stdio(false); int N; cin >> N; while (--N) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } dfs(1, 0); dfs1(1, 0); cout << ans << ' ' << freq << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...