제출 #945268

#제출 시각아이디문제언어결과실행 시간메모리
945268GrandTiger1729Hard route (IZhO17_road)C++17
0 / 100
1 ms348 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e18; 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) { update((it->first + it2->first) * it3->first, 1ll * it->second * it2->second + 1ll * it->second * it3->second + 1ll * it2->second * it3->second); } else if (it2->first == it3->first) { update((it->first + it2->first) * it3->first, 1ll * it->second * it2->second + 1ll * it->second * it3->second); } else { update((it->first + it2->first) * it3->first, 1ll * it->second * 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; }

컴파일 시 표준 에러 (stderr) 메시지

road.cpp: In lambda function:
road.cpp:27:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp: In lambda function:
road.cpp:72:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp:104:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |             for (int i = 0; i < g[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~
road.cpp:114:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |             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...