Submission #1174362

#TimeUsernameProblemLanguageResultExecution timeMemory
1174362guilhermecppHard route (IZhO17_road)C++20
0 / 100
3 ms7496 KiB
#include <bits/stdc++.h> using namespace std; #define N 300010 #define M 3 #define INF 1000000010 #define fi first #define se second #define pb push_back typedef long long ll; typedef pair< ll, ll > pll; typedef vector< ll > vl; typedef vector< pll > vll; ll n; vl grafo[N]; pll invalid = {0, 0}; pll fart[N][M+1]; pll aux[N][M+1]; pll dp[N]; void Add(ll u, ll val) { for(ll i = 1;i <= M;i++) { if(fart[u][i].fi != val) continue; fart[u][i].se++; return; } if(fart[u][M].fi < val) fart[u][M] = {val, 1LL}; sort(fart[u] + 1, fart[u] + M + 1, greater< pll >()); return; } void Rem(ll u, ll val) { for(ll i = 1;i <= M;i++) { if(fart[u][i].fi != val) continue; fart[u][i].se--; if(fart[u][i].se != 0) return; fart[u][i] = invalid; break; } sort(fart[u] + 1, fart[u] + M + 1, greater< pll >()); return; } void Copy(pll *a, pll *b) { for(ll i = 1;i <= M;i++) b[i] = a[i]; return; } pll Calc(pll *vet) { if(vet[1].se + vet[2].se + vet[3].se < 3) return invalid; ll a, b; if(vet[1].se >= 3) { a = vet[1].fi * (vet[1].fi + vet[1].fi); b = (vet[1].se * (vet[1].se - 1)) / 2; }else if(vet[1].se == 2) { a = vet[1].fi * (vet[1].fi + vet[2].fi); b = vet[1].se * vet[2].se; }else if(vet[2].se >= 2) { a = vet[1].fi * (vet[2].fi + vet[2].fi); b = (vet[2].se * (vet[2].se - 1)) / 2; }else { a = vet[1].fi * (vet[2].fi + vet[3].fi); b = vet[2].se * vet[3].se; } return {a, b}; } void DFS(ll u, ll pai) { for(ll i = 1;i <= M;i++) fart[u][i] = invalid; for(auto v : grafo[u]) { if(v == pai) continue; DFS(v, u); Add(u, fart[v][1].fi+1); } return; } void Solv(ll u, ll pai) { dp[u] = Calc(fart[u]); Copy(fart[u], aux[u]); for(auto v : grafo[u]) { if(v == pai) continue; Rem(u, fart[v][1].fi+1); if((fart[u][1].fi != u) || (fart[u][1].se == 1)) { Add(v, fart[u][1].fi+1); }else { Add(v, fart[u][2].fi+1); } Solv(v, u); Copy(aux[u], fart[u]); } return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll u, v, i; cin >> n; for(i = 1;i < n;i++) { cin >> u >> v; grafo[u].pb(v); grafo[v].pb(u); } DFS(1, 1); Solv(1, 1); sort(dp + 1, dp + n + 1, greater< pll >()); dp[n+1] = {-1, -1}; i = 2; while(dp[i].fi == dp[1].fi) dp[1].se += dp[i++].se; if(dp[1].se == 0) dp[1].se = 1; cout << dp[1].fi << " " << dp[1].se << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...