제출 #766449

#제출 시각아이디문제언어결과실행 시간메모리
766449zsombor경주 (Race) (IOI11_race)C++17
100 / 100
359 ms36212 KiB
#include <iostream>
#include <vector>
#include <queue>
#include "race.h"
using namespace std;

int n, k, a, b, w, sz, c, ans = 1e9;
vector <vector <pair <int, int>>> g(2e5);
vector <bool> del(2e5, false);
vector <int> mn(1e6 + 1, 1e9);
queue <int> q;

int find_c(int x) {
	if (del[x]) return 0;
	del[x] = true;
	int mx = 0, sum = 1;
	for (auto& p : g[x]) {
		a = find_c(p.first);
		mx = max(mx, a);
		sum += a;
	}
	if (mx <= sz / 2 && sz - sum <= sz / 2) c = x;
	del[x] = false;
	return sum;
}

void dfs1(int x, int d, int wd) {
	if (del[x] || wd > k) return;
	del[x] = true;
	ans = min(ans, d + mn[k - wd]);
	for (auto& p : g[x]) dfs1(p.first, d + 1, wd + p.second);
	del[x] = false;
}

void dfs2(int x, int d, int wd) {
	if (del[x] || wd > k) return;
	del[x] = true;
	mn[wd] = min(mn[wd], d);
	q.push(wd);
	for (auto& p : g[x]) dfs2(p.first, d + 1, wd + p.second);
	del[x] = false;
}

void solve(int x) {
	if (del[x]) return;
	sz = find_c(x);
	find_c(x);
	del[c] = true;
	for (auto& p : g[c]) {
		dfs1(p.first, 1, p.second);
		dfs2(p.first, 1, p.second);
	}
	while (q.size()) { mn[q.front()] = 1e9; q.pop(); }
	for (auto& p : g[c]) solve(p.first);
}

int best_path(int N, int K, int H[][2], int L[]) {
	n = N; k = K;
	for (int i = 0; i < n - 1; i++) {
		a = H[i][0];
		b = H[i][1];
		w = L[i];
		g[a].push_back({ b,w });
		g[b].push_back({ a,w });
	}
	mn[0] = 0;
	solve(0);
	return (ans < 1e9 ? ans : -1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...