Submission #935808

#TimeUsernameProblemLanguageResultExecution timeMemory
935808BF001Hard route (IZhO17_road)C++17
100 / 100
643 ms104948 KiB
#include <bits/stdc++.h> using namespace std; #define N 500005 #define int long long #define fi first #define se second typedef pair<int, int> ii; int n, dp[N], cnt[N], res = 0, way = 1; vector<int> adj[N]; void init(int u, int p){ cnt[u] = 1; for (auto x : adj[u]){ if (x == p) continue; init(x, u); if (dp[x] + 1 == dp[u]){ cnt[u] += cnt[x]; } if (dp[x] + 1 > dp[u]) cnt[u] = cnt[x]; dp[u] = max(dp[u], dp[x] + 1); } } bool cmp (int& i, int& j){ return dp[i] > dp[j]; } void rr(int u, int p){ sort(adj[u].begin(), adj[u].end(), cmp); if (adj[u].size() >= 3){ int cur = 0, cn = 0; int a = dp[adj[u][0]] + 1, b = dp[adj[u][1]] + 1, c = dp[adj[u][2]] + 1; cur = a * (b + c); int ca = 0; for (auto x : adj[u]){ if (dp[x] + 1 == c) cn += ca * cnt[x]; if (dp[x] + 1 == b) ca += cnt[x]; } if (cur > res) res = cur, way = cn; else if (cur == res) way += cn; //cout << u << ' ' << " " << cur << " " << way << "\n"; } ii f = {0, 1}, s = {0, 0}; for (auto x : adj[u]){ if (dp[x] + 1 > f.fi) s = f, f = {dp[x] + 1, cnt[x]}; else if (dp[x] + 1 == f.fi) f.se += cnt[x]; else if (dp[x] + 1 > s.fi) s = {dp[x] + 1, cnt[x]}; else if (dp[x] + 1 == s.fi) s.se += cnt[x]; } int tmpdp = dp[u], tmpcnt = cnt[u]; for (auto x : adj[u]){ if (x == p) continue; dp[u] = f.fi, cnt[u] = f.se; if (dp[x] + 1 == f.fi && cnt[x] == f.se) dp[u] = s.fi, cnt[u] = s.se; else if (dp[x] + 1 == f.fi && cnt[x] != f.se) dp[u] = f.fi, cnt[u] = f.se - cnt[x]; rr(x, u); } dp[u] = tmpdp, cnt[u] = tmpcnt; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cin >> n; for (int i = 1; i <= n - 1; i++){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } init(1, 0); rr(1, 0); cout << res << " " << way; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...