Submission #31791

#TimeUsernameProblemLanguageResultExecution timeMemory
31791DiuvenDreaming (IOI13_dreaming)C++11
18 / 100
66 ms11384 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; typedef struct {int to, cost;} edge; vector<edge> G[100010]; vector<int> rad; bool done[100010]; int N, M, L, tmp, sz[100010], u, D; int dfs(int v){ done[v]=true, sz[v]=1; for(auto& e:G[v]) if(!done[e.to]) sz[v]+=dfs(e.to); return sz[v]; } int findcen(int v){ dfs(v); int now=v; bool iscen=false; while(!iscen){ iscen=true; for(auto& e:G[now]) if(sz[now]>sz[e.to]&&sz[e.to]>sz[v]/2){ iscen=false, now=e.to; break; } } return now; } void find(int v, int p=-1, int d=0){ if(tmp<=d) tmp=d, u=v; for(auto& e:G[v]) if(e.to!=p) find(e.to, v, d+e.cost); } int travelTime(int N, int M, int L, int A[], int B[], int T[]){ for(int i=0; i<M; i++){ G[A[i]+1].push_back({B[i]+1, T[i]}); G[B[i]+1].push_back({A[i]+1, T[i]}); } for(int i=1; i<=N; i++) if(!done[i]){ int c=findcen(i); tmp=0, find(c), rad.push_back(tmp); tmp=0, find(u), D=max(D, tmp); } sort(rad.begin(), rad.end(), greater<int>()); if(rad.size()>1U) D=max(D, rad[0]+rad[1]+L); if(rad.size()>2U) D=max(D, rad[1]+rad[2]+2*L); return D; }
#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...