Submission #469999

#TimeUsernameProblemLanguageResultExecution timeMemory
469999Newtech66Dreaming (IOI13_dreaming)C++17
32 / 100
101 ms13668 KiB
#include "dreaming.h" #include<bits/stdc++.h> using namespace std; using lol=long long int; void dfs(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,vector<int>& D,vector<int>& sD,vector<int>& marked) { vis[u]=1; for(auto [v,w]:g[u]) { if(vis[v]==1) continue; dfs(v,g,vis,D,sD,marked); if(D[v]+w>=D[u]) { sD[u]=D[u]; D[u]=D[v]+w; marked[u]=v; }else if(D[v]+w>=sD[u]) { sD[u]=D[v]+w; } } } void reroot(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,vector<int>& D,vector<int>& sD,vector<int>& marked,vector<int>& fD) { vis[u]=2; for(auto [v,w]:g[u]) { if(vis[v]==2) continue; if(v!=marked[u]) { if(fD[u]+w>=D[v]) { sD[v]=fD[v]; fD[v]=fD[u]+w; marked[v]=u; }else if(fD[u]+w>=sD[v]) { fD[v]=D[v]; sD[v]=fD[u]+w; } }else { if(sD[u]+w>=D[v]) { sD[v]=fD[v]; fD[v]=sD[u]+w; marked[v]=u; }else if(sD[u]+w>=sD[v]) { fD[v]=D[v]; sD[v]=sD[u]+w; } } reroot(v,g,vis,D,sD,marked,fD); } } int getrep(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,const vector<int>& fD) { vis[u]=3; int mn=fD[u]; for(auto [v,w]:g[u]) { if(vis[v]==3) continue; mn=min(mn,getrep(v,g,vis,fD)); } return mn; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { vector<vector<pair<int,int> > > g(N); for(int i=0;i<M;i++) { g[A[i]].push_back({B[i],T[i]}); g[B[i]].push_back({A[i],T[i]}); } vector<int> D(N,0),sD(N,0),fD(N,0),marked(N,-1); vector<int> vis(N,0); vector<int> reps; for(int i=0;i<N;i++) { if(vis[i]==0) { dfs(i,g,vis,D,sD,marked); fD[i]=D[i]; reroot(i,g,vis,D,sD,marked,fD); reps.push_back(getrep(i,g,vis,fD)); } } sort(reps.rbegin(),reps.rend()); /*for(auto& e:D) cout<<e<<" "; cout<<endl; for(auto& e:sD) cout<<e<<" "; cout<<endl; for(auto& e:fD) cout<<e<<" "; cout<<endl; for(auto& e:reps) cout<<e<<" "; cout<<endl;*/ int ans=max(reps[0],*max_element(fD.begin(),fD.end())); if(reps.size()>1) ans=max(ans,L+reps[0]+reps[1]); if(reps.size()>2) ans=max(ans,2*L+reps[1]+reps[2]); return ans; }
#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...