Submission #863606

#TimeUsernameProblemLanguageResultExecution timeMemory
863606Huseyn123Dreaming (IOI13_dreaming)C++17
77 / 100
1092 ms18472 KiB
#include "dreaming.h" #include <bits/stdc++.h> #define MAX 100001 #define INF INT_MAX #define MOD 1000000007 #define mp make_pair #define mt make_tuple #define pb push_back #define ins insert #define ff first #define ss second #define gett(x,m) get<m>(x) #define all(a) a.begin(),a.end() #define lb(a,b) lower_bound(all(a),b) #define ub(a,b) upper_bound(all(a),b) #define sortv(a) sort(all(a)) #define sorta(a,sz) sort(a,a+sz) #define inputar(a,b){\ for(int i=0;i<b;i++){\ cin >> a[i];\ }\ } #define inputvec(a,b){\ for(int i=0;i<b;i++){\ ll num;\ cin >> num;\ a.pb(num);\ }\ } #define outputar(a,b){\ for(int i=0;i<b;i++){\ cout << a[i] << " ";\ }\ cout << "\n";\ } #define outputvec(a){\ for(auto x:a){\ cout << x << " ";\ }\ cout << "\n";\ } #define reset(a,n,v){\ for(int i=0;i<n;i++){\ a[i]=v;\ }\ } using namespace std; typedef long long ll; typedef unsigned long long ull; typedef tuple<ll,ll,ll> tll; typedef pair<ll,ll> pll; typedef pair<int,int> pii; typedef double db; typedef long double ldb; inline void USACO(string filename){ freopen((filename+".in").c_str(),"r",stdin); freopen((filename+".out").c_str(),"w",stdout); } int h; bool used[MAX]; int dist[MAX]; int dist2[MAX]; int maxdist1[MAX]; pair<pii,pii> maxdist[MAX]; vector<vector<pii>> g; int b[MAX]; vector<int> e; void dfs(int v,int prev){ e.pb(v); used[v]=true; for(auto x:g[v]){ if(x.ff==prev){ continue; } dist[x.ff]=dist[v]+x.ss; dfs(x.ff,v); } } void dfs4(int v,int prev){ for(auto x:g[v]){ if(x.ff==prev){ continue; } dist2[x.ff]=dist2[v]+x.ss; dfs4(x.ff,v); } } void dfs1(int v,int prev){ used[v]=true; maxdist1[v]=dist[v]; for(auto x:g[v]){ if(x.ff==prev){ continue; } dfs1(x.ff,v); maxdist1[v]=max(maxdist1[v],maxdist1[x.ff]); } } void dfs2(int v,int prev){ used[v]=true; maxdist[v]=mp(mp(-INF,-INF),mp(-INF,-INF)); for(auto x:g[v]){ if(x.ff==prev){ continue; } if(maxdist1[x.ff]>maxdist[v].ff.ff){ maxdist[v].ss=max(maxdist[v].ss,maxdist[v].ff); maxdist[v].ff=mp(maxdist1[x.ff],x.ff); } else if(maxdist1[x.ff]>maxdist[v].ss.ff){ maxdist[v].ss=mp(maxdist1[x.ff],x.ff); } dfs2(x.ff,v); } } void dfs3(int v,int prev){ int h1=0; h1=max(h1,maxdist1[v]-dist[v]); if(prev!=-1){ pair<pii,pii> p1=maxdist[prev]; pii p2,p3; p2=p1.ff; p3=p1.ss; b[v]=b[prev]+dist[v]-dist[prev]; if(p2.ss!=v && p2.ff!=-INF){ b[v]=max(b[v],p2.ff+dist[v]-2*dist[prev]); } else if(p3.ff!=-INF){ b[v]=max(b[v],p3.ff+dist[v]-2*dist[prev]); } h1=max(h1,b[v]); } h=min(h,h1); used[v]=true; for(auto x:g[v]){ if(x.ff==prev){ continue; } dfs3(x.ff,v); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { int res; g.resize(N); for(int i=0;i<M;i++){ g[A[i]].pb(mp(B[i],T[i])); g[B[i]].pb(mp(A[i],T[i])); } int maxd=0; for(int i=0;i<N;i++){ if(!used[i]){ e.clear(); dfs(i,-1); int maxd1=0; int maxd2=0; int ind=0; for(auto x:e){ if(dist[x]>maxd1){ maxd1=dist[x]; ind=x; } } dfs4(ind,-1); for(auto x:e){ maxd2=max(maxd2,dist2[x]); } maxd=max(maxd,maxd2); } } memset(used,false,sizeof(used)); for(int i=0;i<N;i++){ if(!used[i]){ dfs1(i,-1); } } memset(used,false,sizeof(used)); for(int i=0;i<N;i++){ if(!used[i]){ dfs2(i,-1); } } memset(used,false,sizeof(used)); vector<int> c; for(int i=0;i<N;i++){ if(!used[i]){ h=INF; dfs3(i,-1); c.pb(h); } } sortv(c); reverse(all(c)); if(c.size()==1){ res=c[0]; } else{ res=c[0]+c[1]+L; } if(c.size()>2){ res=max(res,c[1]+c[2]+2*L); } res=max(maxd,res); return res; } /* int main(){ int n,m,k; cin >> n >> m >> k; int A[m],B[m],T[m]; for(int i=0;i<m;i++){ cin >> A[i] >> B[i] >> T[i]; } cout << travelTime(n,m,k,A,B,T); } */
#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...