Submission #1213651

#TimeUsernameProblemLanguageResultExecution timeMemory
1213651nrg_studioHard route (IZhO17_road)C++20
100 / 100
827 ms187096 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pii pair<ll,ll> #define f first #define s second #define chmin(a, b) a = min(a,b) #define chmax(a, b) a = max(a,b) #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define F0R(i, a) for (int i = 0; i < (a); i++) #define all(x) x.begin(),x.end() #define vec vector const int MAX_N = 5e5; vec<int> adj[MAX_N]; vec<pii> paths[MAX_N]; vec<ll> path[MAX_N]; pii mxpath[MAX_N]; pii ans = {0,1}; void dfs(int cur, int par=-1) { mxpath[cur] = {0,0}; for (int x : adj[cur]) { if (x!=par) { dfs(x,cur); paths[cur].pb({mxpath[x].f+1,mxpath[x].s}); chmax(mxpath[cur].f,mxpath[x].f+1); } } for (auto[x,w] : paths[cur]) { if (x!=mxpath[cur].f) {continue;} mxpath[cur].s += w; } if (adj[cur].size()==1) {paths[cur] = {mxpath[cur] = {0,1}};} } void dfs2(int cur, int par=-1, pii par_info = {-1,1}) { paths[cur].pb({par_info.f+1,par_info.s}); sort(all(paths[cur]),greater<>()); path[cur] = {paths[cur][0].s}; vec<ll> squares = {paths[cur][0].s*paths[cur][0].s}; for (int i=1;i<paths[cur].size();i++) { if (paths[cur][i].f!=paths[cur][i-1].f) {path[cur].pb(0); squares.pb(0);} path[cur].back() += paths[cur][i].s; squares.back() += (paths[cur][i].s*paths[cur][i].s); } if (adj[cur].size()>=3) { pii best; ll mx[3] = {paths[cur][0].f,paths[cur][1].f,paths[cur][2].f}; //cout << cur+1 << ' ' << squares[1]<<' '<<path[cur][1]<<'\n'; //cout << cur+1 << ' ' << mx[0]<<' '<<mx[1]<<' '<<mx[2]<<'\n'; best.f = (mx[1]+mx[2])*mx[0]; if (mx[0]!=mx[1] && mx[1]!=mx[2]) { best.s = path[cur][1]*path[cur][2]; } else if (mx[0]==mx[1] && mx[1]!=mx[2]) { best.s = path[cur][0]*path[cur][1]; } else if (mx[0]!=mx[1] && mx[1]==mx[2]) { best.s = (path[cur][1]*path[cur][1]-squares[1])/2; } else { best.s = (path[cur][0]*path[cur][0]-squares[0])/2; } if (ans.f==best.f) {ans.s += best.s;} else if (best.f>ans.f) {ans = best;} } for (int x : adj[cur]) { if (x!=par) { if (mxpath[x].f+1==paths[cur][0].f) { if (mxpath[x].s==path[cur][0]) { dfs2(x,cur,{paths[cur][1].f,path[cur][1]}); } else { dfs2(x,cur,{paths[cur][0].f,path[cur][0]-mxpath[x].s}); } } else { dfs2(x,cur,{paths[cur][0].f,path[cur][0]}); } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i=0;i<n-1;i++) { int a, b; cin >> a >> b; adj[--a].pb(--b); adj[b].pb(a); } int rt = 0; for (int i=0;i<n;i++) {if (adj[i].size()>1) {rt = i;}} dfs(rt); dfs2(rt); cout << ans.f << ' ' << ans.s << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...