Submission #1222477

#TimeUsernameProblemLanguageResultExecution timeMemory
1222477Bui_Quoc_CuongRace (IOI11_race)C++20
100 / 100
970 ms34112 KiB
/* 29 . 03. 2008 */
# include <bits/stdc++.h>
using namespace std ;

const int N = 2e5 + 5 ;
const int M = 1e6 + 5 ; 
const long long inf = 1e18 ;

int n, k ;
vector <pair<int,int>> g[N] ;
int is_centroid[N], sz[N] ;
int cnt[M] ;
int ans ;

void dfs(int u, int p) {
	sz[u] = 1 ;
	for(pair<int, int> x : g[u]) {
		int v = x.first ; 
		if(v == p || is_centroid[v]) continue ;
		dfs(v, u) ; 
		sz[u]+= sz[v] ;
	}
}

int findCentroid(int u, int p, int big) {
	for(pair<int, int> x : g[u]) {
		int v = x.first ; 
		if(v == p || is_centroid[v]) continue ; 
		if(sz[v] > big / 2) return findCentroid(v, u, big) ; 
	}
	return u ; 
}

int max_depth ;

void updateAns(int u, int p, int t, int d, int w) {
	if(w > k) return ; 

	if(t == 1) cnt[w] = min(cnt[w], d) ; 
	else ans = min(ans, cnt[k - w] + d) ;

	max_depth = max(max_depth, w) ;

	for(pair<int, int> x : g[u]) {
		int v = x.first , len = x.second ;
		if(v == p || is_centroid[v]) continue ; 
		updateAns(v, u, t, d + 1, w + len) ;
	} 
}

void buildCentroid(int u) {
	dfs(u, - 1) ; 
	int centroid = findCentroid(u, - 1, sz[u]) ; 
	is_centroid[centroid] = 1 ; 

	max_depth = 0 ;

	for(pair<int, int> x : g[centroid]) {
		int v = x.first , w = x.second ;
		if(is_centroid[v]) continue ; 
		updateAns(v, centroid, 0, 1, w) ; 
		updateAns(v, centroid, 1, 1, w) ;
	}

	for(int i = 1; i <= max_depth; i++) cnt[i] = 2e9 ;

	for(pair<int, int> x : g[centroid]) {
		int v = x.first ; 
		if(!is_centroid[v]) buildCentroid(v) ; 
	}
}

void solve() {
	for(int i = 0; i <= k; i++) cnt[i] = 2e9 ;
	ans = 2e9 ;
	cnt[0] = 0 ;
	buildCentroid(1) ;
	cout << (ans >= 2e9 ? - 1 : ans) ;
}

array <int, 2> E[N];

int best_path(int _n, int _k, int h[][2], int l[]){
	n = _n;
	k = _k;
	for(int i = 0; i < n; i++){
		h[i][0]++; h[i][1]++;
		g[h[i][0]].emplace_back(h[i][1], l[i]);
        g[h[i][1]].emplace_back(h[i][0], l[i]);
	}
	for(int i = 0; i <= k; i++) cnt[i] = 2e9;
	ans = 2e9 ;
	cnt[0] = 0 ;
	buildCentroid(1) ;
	return (ans >= 2e9 ? - 1 : ans);
}

// signed main() {
// 	#define task "race"
// 	ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0) ;
// 	// if(fopen(task".inp", "r")) {
// 	// 	freopen(task".inp","r",stdin) ; freopen(task".out","w",stdout) ;
// 	// }
// 	// if(fopen(".inp","r")) {
// 	// 	freopen(".inp","r",stdin) ; freopen(".out","w",stdout) ;
// 	// }
// 	cin >> n >> k ; 
// 	for(int i = 1; i < n; i++) {
// 		int u, v, w ; cin >> u >> v;
// 		u++, v++ ; 
// 		E[i] = {u, v};
// 		// g[u].emplace_back(make_pair(v, w)) ; g[v].emplace_back(make_pair(u, w)) ;
// 	}
// 	for(int i = 1; i < n; i++){
// 		int w; cin >> w;
// 		int u = E[i][0], v = E[i][1];
// 		g[u].emplace_back(make_pair(v, w)) ; g[v].emplace_back(make_pair(u, w)) ;
// 	}
// 	solve() ; 
// 	cerr << "\nTime :" << 0.001 * clock() << "s " ; 
// 	return 0 ;
// }
/* Watbor */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...