제출 #1269188

#제출 시각아이디문제언어결과실행 시간메모리
1269188g4yuhgHard route (IZhO17_road)C++20
100 / 100
608 ms160388 KiB
//Huyduocdithitp #include <bits/stdc++.h> typedef long long ll; #define pii pair<ll, ll> #define MP make_pair #define fi first #define se second #define TASK "road" #define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);} #define faster ios_base::sync_with_stdio(false);cin.tie(NULL); #define N 500005 #define LOG 19 #define endl '\n' using namespace std; bool ghuy4g; ll n; vector<ll> adj[N]; ll d[N][2], c[N][2]; pii ans; void dfs(ll u, ll parent) { vector<pii> vt; for (auto v : adj[u]) { if (v == parent) continue; dfs(v, u); //vt.push_back({d[v][0] + 1, c[v][0]}); d[v][0] ++ ; if (d[v][0] >= d[u][0]) { d[u][1] = d[u][0]; d[u][0] = d[v][0]; } else if (d[v][0] >= d[u][1]) { d[u][1] = d[v][0]; } d[v][0] -- ; } for (auto v : adj[u]) { if (v == parent) continue; if (d[v][0] + 1 == d[u][0]) { c[u][0] += c[v][0]; } if (d[v][0] + 1 == d[u][1]) { c[u][1] += c[v][0]; } } if (d[u][0] == 0) { c[u][0] = 1; } if (d[u][1] == 0) { c[u][1] = 1; } } void reroot(ll u, ll parent) { d[u][0] = d[u][1] = c[u][0] = c[u][1] = 0; vector<pii> vt; for (auto v : adj[u]) { vt.push_back({d[v][0] + 1, c[v][0]}); d[v][0] ++ ; if (d[v][0] >= d[u][0]) { d[u][1] = d[u][0]; d[u][0] = d[v][0]; } else if (d[v][0] >= d[u][1]) { d[u][1] = d[v][0]; } d[v][0] -- ; if (u == 2) { //cout << v << " : " << d[v][0] + 1 << " " << c[v][0] << endl; } } for (auto v : adj[u]) { if (d[v][0] + 1 == d[u][0]) { c[u][0] += c[v][0]; } if (d[v][0] + 1 == d[u][1]) { c[u][1] += c[v][0]; } } if (d[u][0] == 0) { c[u][0] = 1; } if (d[u][1] == 0) { c[u][1] = 1; } pii cnt = {0, 0}; // cnt.fi la ket qua, cnt.se la so con dai bang con thu 2 if (adj[u].size() >= 3) { sort(vt.begin(), vt.end(), greater<pii>()); ll x = vt[0].fi * (vt[1].fi + vt[2].fi); for (pii it : vt) { // ta dang thu chon con it nay la con thu 2 // => no se gop voi cac con bang con thu nhat dang truoc // 0 = 1 = 2 van duoc, vi luon luon co 1 con lam nhanh dai nhat if (it.fi == vt[2].fi) { cnt.fi += cnt.se * it.se; } if (it.fi == vt[1].fi) { cnt.se += it.se; } } if (x > ans.fi) { ans.fi = x; ans.se = cnt.fi; } else if (x == ans.fi) { ans.se += cnt.fi; } } for (auto v : adj[u]) { if (v == parent) continue; ll dv0 = d[v][0], cv0 = c[v][0], du0 = d[u][0], cu0 = c[u][0], dv1 = d[v][1], cv1 = c[v][1]; if (d[v][0] + 1 == d[u][0]) { if (c[v][0] == c[u][0]) { // nhanh to nhat la nhanh nay luon, khong co thu 2 d[u][0] = d[u][1]; c[u][0] = c[u][1]; } else { if (u == 1 && v == 2) { //cout << c[u][0] << " " << c[v][0] << endl; } c[u][0] -= c[v][0]; } } if (u == 2 && v == 3) { //cout << d[u][0] << " here " << endl; } reroot(v, u); d[v][0] = dv0, c[v][0] = cv0, d[u][0] = du0, c[u][0] = cu0, d[v][1] = dv1, c[v][1] = cv1; } } bool klinh; signed main(void) { start; faster; cin >> n; for (int i = 1; i <= n - 1; i ++) { ll u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } ll r = 1; dfs(r, r); reroot(r, r); if (ans.fi == 0) ans.se = 1; cout << ans.fi << " " << ans.se; cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024); return 0; }

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

road.cpp: In function 'int main()':
road.cpp:9:47: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 | #define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
      |                                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
road.cpp:139:9: note: in expansion of macro 'start'
  139 |         start;
      |         ^~~~~
road.cpp:9:76: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 | #define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
      |                                                                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
road.cpp:139:9: note: in expansion of macro 'start'
  139 |         start;
      |         ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...