Submission #881637

#TimeUsernameProblemLanguageResultExecution timeMemory
881637nikdDreaming (IOI13_dreaming)C++17
0 / 100
30 ms14168 KiB
#include <bits/stdc++.h> #include "dreaming.h" #define MAXN 100001 using namespace std; int maxpar1[MAXN]; int node1[MAXN]; int maxpar2[MAXN]; int maxlength[MAXN]; int maxbyp[MAXN]; bool vis[MAXN]; int tree[MAXN]; int cont; vector<int> mintree; vector<pair<int, int>> adj[MAXN]; void dfs1(int v, int p){ tree[v]=cont; vis[v]=true; if(adj[v].size()==1&&p!=v){ maxpar1[v]=0; maxpar2[v]=0; } else{ for (auto u : adj[v]) { if (u.first != p){ dfs1(u.first, v); if(maxpar1[v]<maxpar1[u.first]+u.second){ maxpar2[v]=maxpar1[v]; maxpar1[v]=maxpar1[u.first]+u.second; node1[v]=u.first; } else if(maxpar2[v]<maxpar1[u.first]+u.second){ maxpar2[v]=maxpar1[u.first]+u.second; } } } } maxlength[v]=maxpar1[v]; } void dfs2(int v, int p, int d){ vis[v]=true; if(v!=p){ if(node1[p]!=v){ maxbyp[v]= max(maxpar1[p]+d, maxbyp[p]+d); maxlength[v]=max(maxlength[v], maxbyp[v]); } else{ maxbyp[v]=max(maxpar2[p]+d, maxbyp[p]+d); maxlength[v]=max(maxlength[v], maxbyp[v]); } } for (auto u : adj[v]) { if (u.first != p){ dfs2(u.first, v, u.second); } } } int travelTime(int N, int M, int L, int A[], int B[], int T[]){ for(int i = 0; i<M; i++){ adj[A[i]].push_back({B[i], T[i]}); adj[B[i]].push_back({A[i], T[i]}); } for(int i = 0; i<N; i++){ maxpar1[i]=0; maxpar2[i]=0; maxlength[i]=0; maxbyp[i]=0; vis[i]=false; } cont =0; for(int i =0; i<N; i++){ if(!vis[i]){ mintree.push_back(INT_MAX); dfs1(i,i); cont++; } } for(int i =0; i<N; i++) vis[i]=false; for(int i =0; i<N; i++){ if(!vis[i]){ dfs2(i, i, 0); } } int maxbest1=-1; int maxbest2=-1; int maxbest3=-1; for(int i =0; i<N; i++){ if(maxlength[i]<mintree[tree[i]]){ mintree[tree[i]]=maxlength[i]; } } for(int j: mintree){ if(j>maxbest1){ maxbest3=maxbest2; maxbest2=maxbest1; maxbest1=j; } else if(j>maxbest2){ maxbest3=maxbest2; maxbest2=j; } else if(j>maxbest3){ maxbest3=j; } } int sol; if(maxbest3!=-1){ sol =max(maxbest1+L+maxbest2, maxbest2+maxbest3+2*L); } else sol=maxbest1+L+maxbest2; return sol; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...