제출 #551201

#제출 시각아이디문제언어결과실행 시간메모리
551201Sohsoh84Race (IOI11_race)C++17
100 / 100
920 ms63352 KiB
#include "race.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 INF = 1e9;
const ll MAXN = 1e6 + 10;

int n, k, ans, sz[MAXN];
vector<pll> adj[MAXN];
bool B[MAXN];
map<ll, int> mp;
vector<pll> vec;

int sub_sz(int v, int p) {
	sz[v] = 1;
	for (auto [u, w] : adj[v])
		if (!B[u] && u != p)
			sz[v] += sub_sz(u, v);
	return sz[v];
}

int centroid(int v, int p, int n) {
	for (auto [u, w] : adj[v])
		if (!B[u] && u != p && sz[u] * 2 > n)
			return centroid(u, v, n);
	return v;
}

void dfs(int v, int p, ll w, int l) {
	vec.push_back({w, l});
	auto it = mp.find(k - w);
	if (it != mp.end()) ans = min(ans, l + it -> Y);

	for (auto [u, e_w] : adj[v])
		if (u != p && !B[u])
			dfs(u, v, w + e_w, l + 1);
}

void solve(int v) { 
	B[v = centroid(v, 0, sub_sz(v, 0))] = true;
	mp.clear();
	mp[0] = 0;

	for (auto [u, w] : adj[v]) {
		if (!B[u]) {
			dfs(u, v, w, 1);
			for (pll e : vec) {
				auto it = mp.find(e.X);
				if (it == mp.end() || it -> Y > e.Y)
					mp[e.X] = e.Y;
			}

			vec.clear();
		}
	}

	for (auto [u, w] : adj[v])
		if (!B[u])
			solve(u);
}

int best_path(int N, int K, int H[][2], int L[]) {
	n = N, k = K;
	for (int i = 0; i < n - 1; i++) {
		int u = H[i][0], v = H[i][1], l = L[i];
		u++, v++;
		adj[u].push_back({v, l});
		adj[v].push_back({u, l});
	}

	ans = INF;
	solve(1);
	return (ans == INF ? -1 : 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...