Submission #760622

#TimeUsernameProblemLanguageResultExecution timeMemory
760622SanguineChameleonRace (IOI11_race)C++17
100 / 100
391 ms36396 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;

const int maxN = 2e5 + 20;
const int maxK = 1e6 + 20;
vector<pair<int, int>> adj[maxN];
bool flag[maxN];
int sz[maxN];
int best[maxK];
pair<int, int> dist[maxN];
int res;
int N, K;

void dfs1(int u, int p) {
	sz[u] = 1;
	for (auto e: adj[u]) {
		int v = e.first;
		if (!flag[v] && v != p) {
			dfs1(v, u);
			sz[u] += sz[v];
		}
	}
}

int cen(int r, int u, int p) {
	for (auto e: adj[u]) {
		int v = e.first;
		if (!flag[v] && v != p && sz[v] * 2 > sz[r]) {
			return cen(r, v, u);
		}
	}
	return u;
}

void dfs2(int u, int p, int op) {
	if (dist[u].second > K) {
		return;
	}
	if (op == 1) {
		res = min(res, dist[u].first + best[K - dist[u].second]);
	}
	if (op == 2) {
		best[dist[u].second] = min(best[dist[u].second], dist[u].first);
	}
	if (op == 3) {
		best[dist[u].second] = N;
	}
	for (auto e: adj[u]) {
		int v = e.first;
		int w = e.second;
		if (!flag[v] && v != p) {
			dist[v] = make_pair(dist[u].first + 1, dist[u].second + w);
			dfs2(v, u, op);
		}
	}
}

void solve(int u) {
	dfs1(u, -1);
	u = cen(u, u, -1);
	for (auto e: adj[u]) {
		int v = e.first;
		int w = e.second;
		if (!flag[v]) {
			dist[v] = make_pair(1, w);
			dfs2(v, u, 1);
			dfs2(v, u, 2);
		}
	}
	for (auto e: adj[u]) {
		int v = e.first;
		int w = e.second;
		if (!flag[v]) {
			dist[v] = make_pair(1, w);
			dfs2(v, u, 3);
		}
	}
	flag[u] = true;
	for (auto e: adj[u]) {
		int v = e.first;
		if (!flag[v]) {
			solve(v);
		}
	}
}

int best_path(int _N, int _K, int H[][2], int L[]) {
	N = _N;
	K = _K;
	best[0] = 0;
	for (int i = 1; i <= K; i++) {
		best[i] = N;
	}
	res = N;
	for (int i = 0; i < N - 1; i++) {
		int u = H[i][0];
		int v = H[i][1];
		int w = L[i];
		adj[u].emplace_back(v, w);
		adj[v].emplace_back(u, w);
	}
	solve(1);
	if (res == N) {
		return -1;
	}
	else {
		return res;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...