Submission #885513

#TimeUsernameProblemLanguageResultExecution timeMemory
885513alexddHard route (IZhO17_road)C++17
19 / 100
2058 ms236088 KiB
#include<bits/stdc++.h> using namespace std; /*ifstream fin("road.in"); ofstream fout("road.out"); #define cin fin #define cout fout*/ #define int long long int n; vector<int> con[500005]; map<int,pair<int,pair<int,int>>> dp[500005]; int root; int depth[500005]; int siz[500005]; int maxd[500005]; int sus[500005]; int parent[500005]; pair<int,int> mxm = {0,0}; pair<int,pair<int,int>> combine(pair<int,pair<int,int>> x, pair<int,pair<int,int>> y) { if(x.second.second==0) return y; if(y.second.second==0) return x; if(x.first > y.first) return x; if(x.first < y.first) return y; return {x.first, {x.second.first + y.second.first, x.second.second + y.second.second}}; } void dfs_init(int nod, int par) { parent[nod]=par; siz[nod]=1; maxd[nod]=depth[nod]; for(auto adj:con[nod]) { if(adj!=par) { depth[adj]=depth[nod]+1; dfs_init(adj,nod); maxd[nod] = max(maxd[nod], maxd[adj]); siz[nod]+=siz[adj]; } } } void dfs(int nod) { //cout<<nod<<" start\n"; int cntc=0; set<pair<int,int>> s; s.insert({-1,-1}); for(auto adj:con[nod]) { if(adj!=parent[nod]) { dfs(adj); s.insert({maxd[adj], adj}); cntc++; } } //cout<<nod<<" dfs done\n"; for(auto adj:con[nod]) { if(adj==parent[nod]) continue; for(auto adj2:con[nod]) { if(adj2==parent[nod] || adj>=adj2) continue; s.erase({maxd[adj],adj}); s.erase({maxd[adj2],adj2}); for(auto it:dp[adj]) { for(auto it2:dp[adj2]) { pair<int,int> idk = *s.rbegin(); ///pair<int,int> aux = {(it.first + it2.first - 2*depth[nod]) * max({it.second.first,it2.second.first,sus[nod],idk.first-depth[nod]}), it.second.second * it2.second.second}; int moduri; if(max(sus[nod],idk.first-depth[nod]) == max({it.second.first,it2.second.first,sus[nod],idk.first-depth[nod]})) { moduri = it.second.second.second * it2.second.second.second; } else if(it.second.first > it2.second.first) { moduri = it.second.second.first * it2.second.second.second; } else if(it.second.first < it2.second.first) { moduri = it2.second.second.first * it.second.second.second; } else { moduri = it.second.second.first * it2.second.second.second + it2.second.second.first * it.second.second.second - it.second.second.first * it2.second.second.first; } pair<int,int> aux = {(it.first + it2.first - 2*depth[nod]) * max({it.second.first,it2.second.first,sus[nod],idk.first-depth[nod]}), moduri}; if(aux.first > mxm.first) mxm = aux; else if(aux.first == mxm.first) mxm.second += aux.second; } } s.insert({maxd[adj],adj}); s.insert({maxd[adj2],adj2}); } } //cout<<nod<<" mxm calc done\n"; if(cntc==0) { dp[nod][depth[nod]] = {0,{1,1}}; } else { for(auto adj:con[nod]) { if(adj==parent[nod]) continue; s.erase({maxd[adj],adj}); pair<int,int> idk = *s.rbegin(); //cout<<nod<<" "<<adj<<" "<<idk.first<<" "<<idk.second<<" idk\n"; for(auto it:dp[adj]) { pair<int,pair<int,int>> x = it.second; x.first = max(x.first, idk.first - depth[nod]); if(idk.first - depth[nod] >= x.first) { x = {idk.first - depth[nod], {x.second.second, x.second.second}}; } dp[nod][it.first] = combine(dp[nod][it.first], x); } s.insert({maxd[adj],adj}); //dp[adj].clear(); } } //for(auto it:dp[nod]) // cout<<nod<<" "<<it.first<<" "<<it.second.first<<" "<<it.second.second<<"\n"; //cout<<nod<<" end\n"; } void calc_sus() { for(int i=1;i<=n;i++) { sus[i] = depth[i]; int prec=i; for(int j=parent[i];j!=0;j=parent[j]) { for(auto adj:con[j]) { if(adj!=parent[j] && adj!=prec) { sus[i] = max(sus[i], (maxd[adj] - depth[j]) + (depth[i] - depth[j])); } } prec=j; } //cout<<i<<" "<<sus[i]<<" sus\n"; } } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; if(n==2) { cout<<0<<" "<<1; return 0; } int a,b; for(int i=1;i<n;i++) { cin>>a>>b; con[a].push_back(b); con[b].push_back(a); } for(int i=n;i>0;i--) if((int)con[i].size()>1) root=i; //cout<<root<<" is the root\n"; dfs_init(root,0); calc_sus(); dfs(root); cout<<mxm.first<<" "<<mxm.second<<"\n"; return 0; } /** 7 1 2 1 3 2 4 2 5 4 6 4 7 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...