Submission #731415

#TimeUsernameProblemLanguageResultExecution timeMemory
731415lucriDreaming (IOI13_dreaming)C++17
100 / 100
106 ms12524 KiB
#include <bits/stdc++.h> #include "dreaming.h" int nr,t[100010],v[100010],pd[100010],n,m,l,ans; bool viz[100010]; std::vector<std::vector<std::pair<int,int>>>a; inline int tata(int nod) { if(t[nod]==nod) return nod; return t[nod]=tata(t[nod]); } inline void parcurge1(int nod,int &nod2,int &vnod2) { viz[nod]=true; if(pd[nod]>vnod2) { vnod2=pd[nod]; nod2=nod; } for(auto x:a[nod]) { if(viz[x.first]==false) { pd[x.first]=pd[nod]+x.second; parcurge1(x.first,nod2,vnod2); pd[x.first]=0; } } } inline void parcurge2(int nod,int &vnod) { viz[nod]=false; if(pd[nod]>vnod) vnod=pd[nod]; for(auto x:a[nod]) { if(viz[x.first]==true) { pd[x.first]=pd[nod]+x.second; parcurge2(x.first,vnod); pd[x.first]=0; } } } inline int diametru(int nod) { int nod2=nod,vnod2=0; parcurge1(nod,nod2,vnod2); vnod2=0; parcurge2(nod2,vnod2); return vnod2; } inline void initpd(int nod) { viz[nod]=true; for(auto x:a[nod]) { if(viz[x.first]==false) { initpd(x.first); pd[nod]=std::max(pd[nod],pd[x.first]+x.second); } } } inline int greutate(int nod) { int ans=1000000000,rad=nod,rado=nod; do { int ansa=0; nod=rad; for(auto x:a[nod]) { if(x.second+pd[x.first]>ansa) { ansa=x.second+pd[x.first]; rad=x.first; } } if(ansa<ans) { ans=ansa; rado=nod; } pd[nod]=0; for(auto x:a[nod]) { if(x.first!=rad) { if(x.second+pd[x.first]>pd[nod]) pd[nod]=x.second+pd[x.first]; } } }while(rado!=rad); return ans; } inline int construieste(int nod) { int dim=diametru(nod); ans=std::max(ans,dim); if(dim==0) return 0; initpd(nod); return greutate(nod); } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { n=N; m=M; l=L; a.resize(n+5); ans=0; for(int i=0;i<n;++i) t[i]=i; for(int i=0;i<m;++i) { a[A[i]].push_back({B[i],T[i]}); a[B[i]].push_back({A[i],T[i]}); t[t[A[i]]]=tata(B[i]); } for(int i=0;i<n;++i) if(viz[i]==false) v[++nr]=construieste(i); std::sort(v+1,v+nr+1); if(nr>=2) ans=std::max(ans,L+v[nr]+v[nr-1]); if(nr>=3) ans=std::max(ans,2*L+v[nr-2]+v[nr-1]); 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...