Submission #433029

#TimeUsernameProblemLanguageResultExecution timeMemory
433029GurbanRace (IOI11_race)C++17
100 / 100
726 ms37272 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int N = 1e6+5;
const int maxn=2e5+5;
int cnt[N],ans = 1e9;
int sub[maxn],k;
bool done[maxn];
vector<int>v;
vector<pair<int,int>>E[maxn];

void dfs(int nd,int pr){
	sub[nd] = 1;
	for(auto i : E[nd]) if(i.first != pr and !done[i.first]) dfs(i.first,nd), sub[nd] += sub[i.first];
}

int cent(int nd){
	int sz = sub[nd];
	while(1){
		pair<int,int>mx = {0,0};
		for(auto i : E[nd]){
			if(!done[i.first] and sub[i.first] < sub[nd] and sub[i.first] > mx.first) mx = {sub[i.first],i.first};
		}
		if(mx.first * 2 <= sz) return nd;
		nd = mx.second;
	}
}

void calc(int nd,int pr,int lvl,ll ds){
	if(ds <= k){
		assert(k-ds < N and k-ds >= 0);
		ans = min(ans,cnt[k-ds] + lvl);
	}
	for(auto i : E[nd])
		if(i.first != pr and !done[i.first]) calc(i.first,nd,lvl+1,ds+i.second);
}

void put(int nd,int pr,int lvl,ll ds){
	if(ds <= k){
		assert(ds < N and ds >= 0);
		cnt[ds] = min(cnt[ds],lvl);
		v.push_back(ds);
	}
	for(auto i : E[nd])
		if(i.first != pr and !done[i.first]) put(i.first,nd,lvl+1,i.second+ds);
}

void f(int nd){
	dfs(nd,-1);
	int cen = cent(nd);
	done[cen] = 1;
	sub[cen] = sub[nd];
	// cout<<cen<<' ';
	for(auto i : E[cen]){
		if(!done[i.first]){
			// if(cen == 1) cout<<i.first<<' ';
			calc(i.first,cen,1,i.second);
			put(i.first,cen,1,i.second);
		}
	}
	for(auto i : v) cnt[i] = 1e9;
	v.clear();
	for(auto i : E[cen])
		if(!done[i.first]) f(i.first);
}

int best_path(int n,int K,int h[][2],int l[]){
	k = K;
	for(int i = 0;i < n-1;i++){
		E[h[i][0]].push_back({h[i][1],l[i]});
		E[h[i][1]].push_back({h[i][0],l[i]});
	}
	for(int i = 1;i < N;i++) cnt[i] = 1e9;
	f(0);
	// cout<<'\n';
	if(ans == 1e9) ans = -1;
	return ans;
}

// int main(){
// 	ios::sync_with_stdio(false);
// 	cin.tie(0);

// 	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...