제출 #331133

#제출 시각아이디문제언어결과실행 시간메모리
331133prarie경주 (Race) (IOI11_race)C++14
21 / 100
3083 ms15980 KiB
#include "race.h"
 
#include <bits/stdc++.h>
 
#define fastio ios_base::sync_with_stdio(0), cin.tie(0)
#define fi first
#define se second
#define endl '\n'
#define sz(v) (int)(v).size()
#define all(v) (v).begin(), (v).end()
#define compress(v) sort(all(v)), (v).erase(unique(all((v))), v.end())
 
using namespace std;
 
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ld = long double;
 
const int N = 2e5 + 5;
const int K = 1e6 + 5;
 
int n, k;
vector<pii> adj[N];
bool fin[N];
int sz[N];
int d[K];
 
int get_cent(int t_size, int cur, int pv = -1) {
	int minx = N;
	for (auto &next : adj[cur]) {
		if (pv == next.first || fin[next.first]) continue;
		if (sz[next.first] > t_size / 2)
			return get_cent(t_size, next.first, cur);
		minx = min(minx, sz[next.first]);
	}
	if (minx <= t_size / 2) return cur;
	return -1;
}
 
void get_sz(int cur, int pv = -1) {
	sz[cur] = 1;
	for (auto &next : adj[cur]) {
		if (next.first == pv || fin[next.first]) continue;
		get_sz(next.first, cur);
		sz[cur] += sz[next.first];
	}
}
 
void assign(int cur, int w, int pv = -1, int cnt = 1) {
	if (w > k) return;
	d[w] = min(d[w], cnt);
	for (auto &next : adj[cur]) {
		if (next.first == pv || fin[next.first]) continue;
		assign(next.first, next.second + w, cur, cnt + 1);
	}
}
 
int get(int cur, int w, int pv = -1, int cnt = 1) {
	int ret = N;
	if (w > k) return ret;
	ret = min(ret, cnt + d[k - w]);
	for (auto &next : adj[cur]) {
		if (next.first == pv || fin[next.first]) continue;
		ret = min(get(next.first, w + next.second, cur, cnt + 1), ret);
	}
	return ret;
}
 
int calc(int node) {
	int ret = N;
	// Find Centroid
	memset(sz, 0, sizeof sz);
	get_sz(node);
	int cent = get_cent(sz[node], node);
	//cout << node << ' ' << cent << endl;
	if (cent == -1) {
		fin[node] = true;
		return ret;
	}
 
	fin[cent] = true;
 
	// Find Minimum nodes of length K
	memset(d, 0x3f, sizeof d);
	d[0] = 0;
	for (auto &next : adj[cent]) {
		if (fin[next.first]) continue;
		ret = min(ret, get(next.first, next.second));
		assign(next.first, next.second);
	}
 
	// call calc for subtrees
	for (auto &next : adj[cent]) {
		if (fin[next.first]) continue;
		ret = min(ret, calc(next.first));
	}
	return ret;
}
 
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], w = L[i];
		adj[u].emplace_back(v, w);
		adj[v].emplace_back(u, w);
	}
	int ans = calc(0);
	return (ans != ::N ? 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...