Submission #764991

#TimeUsernameProblemLanguageResultExecution timeMemory
764991Sohsoh84Dreaming (IOI13_dreaming)C++17
100 / 100
114 ms40264 KiB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

#define X		first
#define Y		second
#define sep		' '
#define debug(x)	cerr << #x << ": " << x << endl;

const ll MAXN = 1e6 + 10;

bool vis[MAXN];
int n, m, l;
vector<pll> adj[MAXN];
ll dist[2][MAXN];
vector<int> C;

void dfs(int v, int p, int c, ll d) {
	dist[c][v] = d;
	vis[v] = true;
	C.push_back(v);

	for (auto [u, l] : adj[v])
		if (u != p)
			dfs(u, v, c, d + l);
}

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

	ll ans = 0;

	vector<ll> vec;
	for (int i = 1; i <= n; i++) {
		if (vis[i]) continue;
		C.clear();
		dfs(i, 0, 0, 0);
		
		int v = i;
		for (int e : C)
			if (dist[0][e] > dist[0][v])
				v = e;


		C.clear();
		dfs(v, 0, 1, 0);
		int u = i;
		for (int e : C)
			if (dist[1][e] > dist[1][u])
				u = e;
		ans = max(ans, dist[1][u]);

		C.clear();
		dfs(u, 0, 0, 0);

		int c = u;
		for (int e : C)
			if (max(dist[0][e], dist[1][e]) < max(dist[0][c], dist[1][c]))
				c = e;

		vec.push_back(max(dist[0][c], dist[1][c]));
	}
	
	sort(vec.begin(), vec.end());
	while (int(vec.size() > 1)) {
		ll x = vec.back();
		vec.pop_back();
		ll y = vec.back();
		vec.pop_back();

		ans = max(ans, x + y + L);
		vec.push_back(max(x, y + L));
	}

	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...