Submission #1170408

#TimeUsernameProblemLanguageResultExecution timeMemory
1170408rayan_bdDreaming (IOI13_dreaming)C++20
47 / 100
58 ms18828 KiB
#include <bits/stdc++.h>
#include "dreaming.h"

using namespace std;

#define ll long long
#define show(n) cout<<n<<'\n'
#define all(v) v.begin(), v.end()
#define pb push_back
#define fi first
#define se second

const int INF = 2e9;
const int mxN = 1e5 + 5000;

vector<pair<int,int>> adj[mxN];
int down_dp[mxN],up_dp[mxN],dp[mxN],vis[mxN],cost1=0,cost2=0,grp=1;
vector<int> group_max(mxN,INF),group_max_node(mxN,0);

void dfs(int u,int par){
	vis[u]=grp;
	for(auto it:adj[u]){
		 if(it.fi==par) continue;
		 dfs(it.fi,u);
		 down_dp[u]=max(down_dp[u],down_dp[it.fi]+it.se);
	}
}

void reroot(int u,int par){
	int c[2]; pair<int,int> p;
	p.fi=p.se=-1;
	c[0]=c[1]=0;
	dp[u]=max(dp[u],down_dp[u]);
	for(auto it:adj[u]){
		if(it.fi!=par){
			if(p.fi==-1) p.fi=it.fi,c[0]=it.se;
			else if(down_dp[p.fi]+c[0]<down_dp[it.fi]+it.se){
				swap(p.fi,p.se);
				swap(c[0],c[1]);
				c[0]=it.se;
				p.fi=it.fi;
			}else if(down_dp[p.se]+c[1]<down_dp[it.fi]+it.se){
				p.se=it.fi;
				c[1]=it.se;
			}
		}
	}
	for(auto it:adj[u]){
		if(it.fi^par){
			up_dp[it.fi]=up_dp[u]+it.se;
			if(it.fi==p.fi&&p.fi==-1) up_dp[it.fi]=0;
			else if(it.fi==p.fi) up_dp[it.fi]=max(up_dp[it.fi],down_dp[p.se]+c[1]+it.se);
			else up_dp[it.fi]=max(up_dp[it.fi],down_dp[p.fi]+c[0]+it.se);
			dp[it.fi]=max(up_dp[it.fi],down_dp[it.fi]);
			reroot(it.fi,u);
		}
	}
	cost1=max(cost1,dp[u]);
}

pair<int,int> max_dist(int u,int par,int w){
	pair<int,int> ans={w,u};
	for(auto it:adj[u]){
		if(it.fi!=par){	
			ans=max(ans,max_dist(it.fi,u,w+it.se));
		}
	}
	return ans;
}

int travelTime(int N,int M,int L,int A[],int B[],int T[]){
	for(int i=0;i<M;++i){
		adj[A[i]].pb({B[i],T[i]});
		adj[B[i]].pb({A[i],T[i]});
	}

	for(int i=0;i<N;++i){
		if(vis[i]==0){
			dfs(i,-1);
			reroot(i,-1);
			++grp;
		}
	}

	for(int i=0;i<N;++i){
		if(group_max[vis[i]]>dp[i]){
			group_max[vis[i]]=dp[i];
			group_max_node[vis[i]]=i;
		}
	}

	for(int i=2;i<grp;++i){
		adj[group_max_node[i-1]].pb({group_max_node[i],L});
		adj[group_max_node[i]].pb({group_max_node[i-1],L});
	}


	pair<int,int> p1=max_dist(0,-1,0);
	pair<int,int> p2=max_dist(p1.se,-1,0);

	return max(cost1,group_max[1]+group_max[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...