Submission #945509

#TimeUsernameProblemLanguageResultExecution timeMemory
945509GrandTiger1729Hard route (IZhO17_road)C++17
52 / 100
728 ms262144 KiB
#include <bits/stdc++.h> using namespace std; int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<vector<int>> g(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); } vector<vector<pair<int, int>>> res(n); { vector<bool> vis(n); function<pair<int, int>(int)> dfs = [&](int u) -> pair<int, int> { res[u].resize(g[u].size()); vis[u] = 1; pair<int, int> ret(0, 1); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) { continue; } res[u][i] = dfs(v); if (res[u][i].first > ret.first) { ret = res[u][i]; } else if (res[u][i].first == ret.first) { ret.second += res[u][i].second; } } ret.first++; return ret; }; dfs(0); } long long ans = 0, cnt = 1; auto update = [&](long long x, long long y) { if (y == 0) { return; } if (ans < x) { ans = x; cnt = y; } else if (ans == x) { cnt += y; } }; { vector<bool> vis(n); function<void(int, pair<int, int>)> dfs = [&](int u, pair<int, int> cur) { vis[u] = 1; multiset<pair<int, int>> st; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) { continue; } st.insert(res[u][i]); } if (u != 0) { st.insert(cur); } if (st.size() >= 3) { auto it = --st.end(); auto it3 = it--; auto it2 = it--; if (it->first == it3->first) { int tot = it2->second + it3->second; long long tot2 = 1ll * it2->second * it2->second + 1ll * it3->second * it3->second; auto it4 = it; while (it4->first == it->first) { tot += it4->second; tot2 += 1ll * it4->second * it4->second; if (it4 == st.begin()) { break; } it4--; } update(1ll * (it->first + it2->first) * it3->first, (1ll * tot * tot - tot2) / 2); } else if (it2->first == it3->first) { int tot = 0; auto it4 = it; while (it4->first == it->first) { tot += it4->second; if (it4 == st.begin()) { break; } it4--; } update(1ll * (it->first + it2->first) * it3->first, 1ll * tot * (it2->second + it3->second)); } else if (it->first == it2->first) { int tot = it2->second; long long tot2 = 1ll * it2->second * it2->second; auto it4 = it; while (it4->first == it->first) { tot += it4->second; tot2 += 1ll * it4->second * it4->second; if (it4 == st.begin()) { break; } it4--; } update(1ll * (it->first + it2->first) * it3->first, (1ll * tot * tot - tot2) / 2); } else { int tot = 0; auto it4 = it; while (it4->first == it->first) { tot += it4->second; if (it4 == st.begin()) { break; } it4--; } update(1ll * (it->first + it2->first) * it3->first, 1ll * tot * it2->second); } } map<int, int> mp; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) { continue; } mp[res[u][i].first] += res[u][i].second; } mp[cur.first] += cur.second; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) { continue; } mp[res[u][i].first] -= res[u][i].second; if ((--mp.end())->second == 0) { mp.erase(--mp.end()); } pair<int, int> x = *(--mp.end()); x.first++; dfs(v, x); mp[res[u][i].first] += res[u][i].second; } }; dfs(0, make_pair(0, 1)); } cout << ans << ' ' << cnt << '\n'; return 0; }

Compilation message (stderr)

road.cpp: In lambda function:
road.cpp:26:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp: In lambda function:
road.cpp:71:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp:155:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  155 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp:165:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...