제출 #1345442

#제출 시각아이디문제언어결과실행 시간메모리
1345442mydknRace (IOI11_race)C++17
100 / 100
216 ms33008 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

#define pii pair<int, int>
#define emb emplace_back

const int maxn = 2e5 + 5;
const int maxx = 1e6 + 5;
const int inf = 2e9;

vector<pii> adj[maxn];
int sz[maxn];
bool del[maxn];
vector<pii> dist;
int kk, ssz;
int prv[maxx];
int mn = inf;

void dfs1(int u, int pa){
	sz[u] = 1;
	for(auto [w, v] : adj[u]){
		if(v == pa || del[v]) continue;
		dfs1(v, u);
		sz[u] += sz[v];
	}
}

void dfs2(int u, int pa, int cnt, int d){
	if(d > kk) return;
	dist.emb(d, cnt);
	for(auto [w, v] : adj[u]){
		if(v == pa || del[v]) continue;
		dfs2(v, u, cnt + 1, d + w);
	}
}

int cen(int u, int pa){
	for(auto [w, v] : adj[u]){
		if(v == pa || del[v]) continue;
		if(sz[v] * 2 > ssz){
			return cen(v, u);
		}
	}
	return u;
}

void solve(int u){
	dfs1(u, -1);
	ssz = sz[u];
	int c = cen(u, -1);
	vector<int> used;
	for(auto [w, v] : adj[c]){
		if(del[v]) continue;
		dist.clear();
		dfs2(v, c, 1, w);
		for(auto [d, cnt] : dist){
			if(prv[kk - d] != inf) mn = min(mn, prv[kk - d] + cnt);
		}
		for(auto [d, cnt] : dist){
			prv[d] = min(prv[d], cnt);
			used.emb(d);
		}
	}
	for(auto e : used) prv[e] = inf;
	used.clear();
	del[c] = 1;
	for(auto [w, v] : adj[c]){
		if(!del[v]) solve(v);
	}
}

int best_path(int n, int k, int h[][2], int l[]){
	kk = k;
	for(int i=0;i<n-1;++i){
		int u = h[i][0], v = h[i][1], w = l[i];
		adj[u].emb(w, v);
		adj[v].emb(w, u);
	}
	fill(prv+1, prv + maxx, inf);
	solve(0);
	return (mn == inf ? -1 : mn);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...