Submission #1202178

#TimeUsernameProblemLanguageResultExecution timeMemory
1202178namhhRace (IOI11_race)C++20
100 / 100
741 ms77284 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e6+1;
int n,k,sz[N],len[N],mx = 0,ans = 1e9;
vector<pii>adj[N];
bool del[N];
int dfs(int u, int p){
	sz[u] = 1;
	for(auto v : adj[u]){
		if(v.fi == p || del[v.fi]) continue;
		sz[u] += dfs(v.fi,u);
	}
	return sz[u];
}
int get_centroid(int u, int p, int con){
	for(auto v : adj[u]) 
	    if(v.fi != p && !del[v.fi] && sz[v.fi] > con/2) return get_centroid(v.fi,u,con);
	return u;
}
void dem(int u, int p, bool type, int h, int cc = 1){
	if(h > k) return;
	mx = max(mx,h);
	if(type) len[h] = min(len[h],cc);
	else ans = min(ans,cc+len[k-h]);
    //cout << u << " " << p << " " << h << "\n";
	for(auto v : adj[u]) 
	    if(v.fi != p && !del[v.fi]) dem(v.fi,u,type,h+v.se,cc+1);
}
void cd(int u){
	int centroid = get_centroid(u,-1,dfs(u,-1));
	del[centroid] = true;
	len[0] = 0;
	mx = 0;
	for(auto v : adj[centroid]){
		if(!del[v.fi]){
			dem(v.fi,centroid,0,v.se);
			dem(v.fi,centroid,1,v.se);
		}
	}
	fill(len,len+mx+1,1e9);
	for(auto v : adj[centroid]) if(!del[v.fi]) cd(v.fi);
}

int best_path(int N, int K, int h[][2], int l[]) {
	n = N, k = K;
	for(int i = 0; i < n - 1; i++){
		adj[h[i][0]].push_back({h[i][1], l[i]});
		adj[h[i][1]].push_back({h[i][0], l[i]});
	}
	for(int i = 0; i <= 2000000; i++) len[i] = 1e9;
	cd(0);
	if(ans == 1e9) return -1;
	else return ans;
}

// int main() {
// 	int N, K;
// 	cin >> N >> K;
// 	int h[N - 1][2], l[N - 1];
// 	for (int i = 0; i < N - 1; i++) {
// 		cin >> h[i][0] >> h[i][1] >> l[i]; 
// 	}
// 	cout << best_path(N, K, h, l);
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...