Submission #399075

#TimeUsernameProblemLanguageResultExecution timeMemory
399075PetremolRace (IOI11_race)C++17
21 / 100
228 ms14276 KiB
#include "race.h"
#include <bits/stdc++.h>
#define int long long int
#define all(x) x.begin(), x.end()
#define send ios_base::sync_with_stdio(false);
#define help cin.tie(NULL)
#define inf (int)(1e17+1)
#define mod (int)(1e9+7)
#define N (int)(2e5+5)
#define fi first
#define se second
#define endl "\n"
#define double long double
#define eps (double)(1e-9)
#define sa cout<<"sa"<<endl
using namespace std;

int n,k;
vector <pair<int,int>> adj[N];
vector <int> sz(N);
vector <bool> mrk(N);

int sdfs(int c,int pre=0){
	sz[c]=1;
	for(auto x:adj[c]){
		if(x.fi==pre||mrk[x.fi]) continue;
		sz[c]+=sdfs(x.fi,c);
	}
	return sz[c];
}

int get(int c,int pre,int s){
	for(auto x:adj[c]){
		if(x.fi==pre||mrk[x.fi]) continue;
		if(2*sz[x.fi]>s) return get(x.fi,c,s);
	}
	return c;
}

map <int,int> cmp;

void dfs(int c,int pre,int d,int cur){
	if(cur>k) return;
	for(auto x:adj[c]){
		if(x.fi==pre||mrk[x.fi]) continue;
		dfs(x.fi,c,d+1,cur+x.se);
	}
	cmp[cur]=d;
}

int ans=inf;

void centroid(int c){
	c=get(c,0,sdfs(c));
	mrk[c]=1;

	map<int,int> mp;
	mp[0]=0;

	for(auto x:adj[c]) if(!mrk[x.fi]){
		dfs(x.fi,c,1,x.se);
		if(mp.size()<cmp.size()) swap(mp,cmp);
		for(auto e:cmp) if(mp.count(k-e.fi)) ans=min(ans,e.se+mp[k-e.fi]);
		for(auto e:cmp){
			if(mp.count(e.fi)) mp[e.fi]=min(mp[e.fi],e.se);
			else mp[e.fi]=e.se;
		}
		cmp.clear();
	}

	for(auto x:adj[c]) if(!mrk[x.fi]) centroid(x.fi);
}

int32_t best_path(int32_t Na, int32_t Ka, int32_t H[][2], int32_t L[]){
	n=Na;k=Ka;
	for(int i=0;i<n-1;i++){
		int u=H[i][0],v=H[i][1],w=L[i];
		++u;++v;
		adj[u].push_back({v,w});
		adj[v].push_back({u,w});
	}
	centroid(1);
	return((ans!=inf)?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...