제출 #129674

#제출 시각아이디문제언어결과실행 시간메모리
129674letrongdatHard route (IZhO17_road)C++17
52 / 100
2057 ms162468 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i, a, b) for(int i=a; i<=b; ++i) #define ford(i, a, b) for(int i=a; i>=b; --i) #define repn(i, a, b) for(int i=a; i <b; ++i) #define repd(i, a, b) for(int i=(int)a -1; i>=b; --i) #define llong long long #define ii pair<llong, llong> const llong INF = 1e10 + 1; const int maxN = 5e5 + 10; int N; vector<ii> D[maxN]; vector<int> E[maxN]; ii F[maxN], out[maxN]; void maximize(ii &a, ii b) { if (a.first < b.first + 1) { a.first = b.first + 1; a.second = b.second; } else if (a.first == b.first + 1) a.second += b.second; } void dfs1(int u, int prv = 0) { F[u] = {-INF, 0}; bool leaf = true; for(auto v: E[u]) if (v != prv) { leaf = false; dfs1(v, u); maximize(F[u], F[v]); D[u].push_back(F[v]); } sort(D[u].begin(), D[u].end()); reverse(D[u].begin(), D[u].end()); D[u].push_back({-INF, 0}); if (leaf) F[u] = {0, 1}; } void dfs2(int u, int prv = 0) { out[u] = {-INF, 0}; if (!prv) out[u] = {0, 1}; else { maximize(out[u], out[prv]); llong sum2 = 0, maxDist2 = -INF; repn(i, 0, D[prv].size()) if (D[prv][i].first + 1 != F[prv].first) { maxDist2 = D[prv][i].first + 1; repn(j, i, D[prv].size()) if (D[prv][j].first == D[prv][i].first) sum2 += D[prv][j].second; else break; break; } if (F[u].first + 1 == F[prv].first) { if (F[u].second != F[prv].second) maximize(out[u], {F[prv].first, F[prv].second -F[u].second}); else maximize(out[u], {maxDist2, sum2}); } else maximize(out[u], F[prv]); } for(auto v: E[u]) if (v != prv) dfs2(v, u); } inline int ReadInt() { int sign = 1; char c; do { c = getchar(); if (c == '-') sign = -sign; } while (c < '0' || c > '9'); int res; for (res = 0; c >= '0' && c <= '9'; c = getchar()) res = res * 10 + (c - '0'); return res * sign; } int main() { //freopen("a.inp", "r", stdin); N = ReadInt(); repn(i, 1, N) { int u, v; u = ReadInt(); v = ReadInt(); E[u].push_back(v); E[v].push_back(u); } dfs1(1); dfs2(1); llong result = 0, ways = 0; forn(u, 1, N) { for(auto &x: D[u]) x.first ++; D[u].push_back(out[u]); sort(D[u].begin(), D[u].end()); reverse(D[u].begin(), D[u].end()); if (D[u].size() <= 3 || D[u][2].first <= 0) continue; while (D[u].size() && D[u].back().first != D[u][2].first) D[u].pop_back(); long long paths, a, ab, abc; paths = a = ab = abc = 0; if (D[u][0].first == D[u][2].first) { for(auto v: D[u]) { ab += v.second * a; a += v.second; } paths = ab; } else { if (D[u][1].first == D[u][2].first) { for(auto v: D[u]) if (v.first != D[u][0].first) { ab += v.second * a; a += v.second; } paths = ab; } else { for(auto v: D[u]) if (v.first == D[u][2].first) a += v.second; if (D[u][0].first == D[u][1].first) paths = (D[u][0].second + D[u][1].second) * a; else paths = D[u][1].second * a; } } llong Dist = D[u][0].first * (D[u][1].first + D[u][2].first); if (result < Dist) { result = Dist; ways = paths; } else if (result == Dist) ways += paths; } if (result == 0) ways = 1; cout << result << ' ' << ways << '\n'; return 0; }

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

road.cpp: In function 'void dfs2(int, int)':
road.cpp:5:52: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define repn(i, a, b)               for(int i=a; i <b; ++i)
road.cpp:41:18:
             repn(i, 0, D[prv].size()) if (D[prv][i].first + 1 != F[prv].first) {
                  ~~~~~~~~~~~~~~~~~~~                
road.cpp:41:13: note: in expansion of macro 'repn'
             repn(i, 0, D[prv].size()) if (D[prv][i].first + 1 != F[prv].first) {
             ^~~~
road.cpp:5:52: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define repn(i, a, b)               for(int i=a; i <b; ++i)
road.cpp:43:22:
                 repn(j, i, D[prv].size()) if (D[prv][j].first == D[prv][i].first) sum2 += D[prv][j].second; 
                      ~~~~~~~~~~~~~~~~~~~            
road.cpp:43:17: note: in expansion of macro 'repn'
                 repn(j, i, D[prv].size()) if (D[prv][j].first == D[prv][i].first) sum2 += D[prv][j].second; 
                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...