Submission #53580

#TimeUsernameProblemLanguageResultExecution timeMemory
53580alenam0161Dreaming (IOI13_dreaming)C++17
100 / 100
230 ms23800 KiB
# include "dreaming.h" #include <iostream> #include <vector> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const int Mxn=1e5+7; vector<int> g[Mxn],cost[Mxn]; bool used[Mxn]; int di[Mxn]; int cur=0; void dfs(int v,int p){ for(int i=0;i<g[v].size();++i){ int to=g[v][i]; int c=cost[v][i]; if(to==p)continue; dfs(to,v); di[v]=max(di[v],di[to]+c); } } void go(int v,int p,int cp){ int cs=-1; int e=0; int r=0; for(int i=0;i<g[v].size();++i){ int to=g[v][i]; int c=cost[v][i]; if(to==p)continue; if(cs==-1||di[cs]+e<di[to]+c){ if(cs!=-1){ r=di[cs]+e; } cs=to; e=c; } else if(di[to]+c>r){ r=di[to]+c; } } cur=min(cur,max(cp,di[v])); // cout<<v<<" "<<cp<<" "<<di[v]<<" "<<r<<endl; for(int i=0;i<g[v].size();++i){ int to=g[v][i]; int c=cost[v][i]; if(to==p)continue; if(cs==to){ go(to,v,max(cp,r)+c); } else{ go(to,v,max(cp,cs==-1? 0:di[cs]+e)); } } } void dfs_fill(int v,int p){ used[v]=true; for(int i=0;i<g[v].size();++i){ if(used[g[v][i]]==true)continue; dfs_fill(g[v][i],v); } } pair<int,int> get(int v,int p){ pair<int,int> Z0=make_pair(0,v); for(int i=0;i<g[v].size();++i){ int to=g[v][i]; int c=cost[v][i]; if(to==p)continue; pair<int,int> e=get(to,v);e.first+=c; Z0=max(Z0,e); } return Z0; } int travelTime (int N, int M, int L, int A[], int B[], int T[]) { memset(di,0,sizeof(di)); memset(used,0,sizeof(used)); for(int i=0;i<M;++i){ g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); cost[A[i]].push_back(T[i]); cost[B[i]].push_back(T[i]); } vector<int> z; int ans=0; for(int i=0;i<N;++i){ if(used[i]==false){ dfs(i,i); cur=1e9; go(i,i,0); int gag=get(i,i).second; ans=max(ans,get(gag,gag).first); z.push_back(cur); dfs_fill(i,i); } } sort(z.begin(),z.end()); reverse(z.begin(),z.end()); if(z.size()==1)ans=max(ans,z[0]); else if(z.size()==2){ ans=max(ans,z[0]+L+z[1]); } else{ ans=max(ans,max(z[0]+L+z[1],L+L+z[1]+z[2])); } return ans; }

Compilation message (stderr)

dreaming.cpp: In function 'void dfs(int, int)':
dreaming.cpp:15:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[v].size();++i){
                 ~^~~~~~~~~~~~
dreaming.cpp: In function 'void go(int, int, int)':
dreaming.cpp:27:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[v].size();++i){
                 ~^~~~~~~~~~~~
dreaming.cpp:44:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int i=0;i<g[v].size();++i){
                  ~^~~~~~~~~~~~
dreaming.cpp: In function 'void dfs_fill(int, int)':
dreaming.cpp:58:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[v].size();++i){
                 ~^~~~~~~~~~~~
dreaming.cpp: In function 'std::pair<int, int> get(int, int)':
dreaming.cpp:65:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g[v].size();++i){
                 ~^~~~~~~~~~~~
#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...