Submission #1277349

#TimeUsernameProblemLanguageResultExecution timeMemory
1277349crispxxDreaming (IOI13_dreaming)C++20
47 / 100
86 ms19648 KiB
#include "dreaming.h"

#include <bits/stdc++.h>
using namespace std;

#define all(x) x.begin(), x.end()
#define pb push_back
#define ar array

template <typename A, typename B>
bool chmin(A &a, const B &b) {
	if(a > b) {
		return a = b, true;
	}
	return false;
}

template <typename A, typename B>
bool chmax(A &a, const B &b) {
	if(a < b) {
		return a = b, true;
	}
	return false;
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
	vector<vector<ar<int, 2>>> adj(n);
	
	// cout << n << ' ' << m << ' ' << l << endl;
	
	for(int i = 0; i < m; i++) {
		// cout << i << endl;
		adj[A[i]].pb({B[i], T[i]});
		adj[B[i]].pb({A[i], T[i]});
	}
	
	vector<int> used(n), mx(n), mx2(n), d(n);
	
	auto dfs = [&](auto &&self, int v) -> void {
		used[v] = true;
		mx[v] = d[v];
		for(auto [to, w] : adj[v]) {
			if(used[to]) continue;
			d[to] = d[v] + w;
			self(self, to);
			chmax(mx2[v], mx[to]);
			if(mx2[v] > mx[v]) swap(mx2[v], mx[v]);
		}
	};
	
	for(int i = 0; i < n; i++) {
		// cout << i << endl;
		if(!used[i]) {
			dfs(dfs, i);
		}
	}
	
	fill(all(used), false);
	
	vector<int> mx_root(n);
	
	int mn = 1e9;
	long long res1 = 0, res2 = 0;
	
	auto dfs2 = [&](auto &&self, int v) -> void {
		used[v] = true;
		
		int ans = max(mx_root[v], mx[v] - d[v]);
		
		chmin(mn, ans);
		chmax(res2, ans);
		
		for(auto [to, w] : adj[v]) {
			if(used[to]) continue;
			
			chmax(mx_root[to], mx_root[v] + w);
			
			int val = mx[v];
			if(val == mx[to]) val = mx2[v];
			
			chmax(mx_root[to], (val - d[v]) + w);
			
			self(self, to);
		}
		
	};
	
	for(int i = 0; i < n; i++) {
		if(!used[i]) {
			mn = 1e9;
			dfs2(dfs2, i);
			res1 += mn;
		}
	}
	
	return max(res1 + l, res2);
}
#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...