Submission #882035

#TimeUsernameProblemLanguageResultExecution timeMemory
882035nikdDreaming (IOI13_dreaming)C++17
0 / 100
28 ms13404 KiB
#include <bits/stdc++.h> #include "dreaming.h" #define MAXN 100001 using namespace std; int f; int max_dis; int par[MAXN]; int tree[MAXN]; int cont=0; vector<int> mintree; bool vis[MAXN]={}; vector<pair<int, int>> adj[MAXN]; int dist[MAXN]={}; void dfs1(int v, int p){ vis[v]=true; for(auto u: adj[v]){ if(u.first!=p){ dist[u.first]=dist[v]+u.second; if(dist[u.first]>max_dis){ max_dis=dist[u.first]; f=u.first; } dfs1(u.first, v); } } } void dfs2(int v, int p){ par[v]=p; for(auto u: adj[v]){ if(u.first!=p){ dist[u.first]=dist[v]+u.second; if(dist[u.first]>max_dis){ max_dis=dist[u.first]; f=u.first; } dfs2(u.first, v); } } } 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++){ if(!vis[i]){ mintree.push_back(INT_MAX); max_dis=0; f=0; dist[i]=0; dfs1(i, i); int a = f; dist[a]=0; max_dis=0; dfs2(a, a); int b = f; int d= max_dis/2; int last=-1; while(dist[b]>d){ last=b; b=par[b]; } if(last==-1){ mintree[cont]=dist[b]; } else{ mintree[cont]=min(dist[last], max_dis-dist[b]); } cont++; } } int maxbest1=0; int maxbest2=0; int maxbest3=0; 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...