Submission #396636

#TimeUsernameProblemLanguageResultExecution timeMemory
396636JasiekstrzDreaming (IOI13_dreaming)C++17
100 / 100
99 ms17524 KiB
#include "dreaming.h" #include<bits/stdc++.h> #define fi first #define se second using namespace std; const int NN=1e5; vector<pair<int,int>> e[NN+10]; bool vis[NN+10]; int dp[NN+10]; int mx[NN+10][2]; int dfs(int x) { int ans=0; vis[x]=true; int mx1=0,mx2=0; for(auto v:e[x]) { if(!vis[v.fi]) { ans=max(ans,dfs(v.fi)); dp[x]=max(dp[x],dp[v.fi]+v.se); if(dp[v.fi]+v.se>=mx1) { mx2=mx1; mx1=dp[v.fi]+v.se; } else if(dp[v.fi]+v.se>=mx2) mx2=dp[v.fi]+v.se; } } mx[x][0]=mx1; mx[x][1]=mx2; return max(ans,mx1+mx2); } void swp(int x,int y,int c,bool xd) { if(mx[x][0]==dp[y]+c) dp[x]=mx[x][1]; else dp[x]=mx[x][0]; if(xd) { if(dp[x]+c>=mx[y][0]) { mx[y][1]=mx[y][0]; mx[y][0]=dp[x]+c; } else if(dp[x]+c>mx[y][1]) mx[y][1]=dp[x]+c; } dp[y]=mx[y][0]; return; } int dfs2(int x,int p) { int ans=dp[x]; for(auto v:e[x]) { if(v.fi==p) continue; swp(x,v.fi,v.se,1); ans=min(ans,dfs2(v.fi,x)); swp(v.fi,x,v.se,0); } return ans; } int travelTime(int N,int M,int L,int A[],int B[],int T[]) { for(int i=0;i<M;i++) { e[A[i]].emplace_back(B[i],T[i]); e[B[i]].emplace_back(A[i],T[i]); } vector<int> tab; int ans=0; for(int i=0;i<N;i++) { if(!vis[i]) { ans=max(ans,dfs(i)); tab.push_back(dfs2(i,0)); } } sort(tab.begin(),tab.end()); reverse(tab.begin(),tab.end()); if(tab.size()==1) return max(ans,tab[0]); else if(tab.size()==2) return max(ans,tab[0]+tab[1]+L); return max({ans,tab[0]+tab[1]+L,tab[1]+tab[2]+2*L}); }
#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...