Submission #172450

#TimeUsernameProblemLanguageResultExecution timeMemory
172450lobo_prixRace (IOI11_race)C++17
100 / 100
1735 ms59328 KiB
#include <bits/stdc++.h>

using namespace std;using f64 = double;using i64=long long;using u64=unsigned long long;
template<typename T> using Arr=vector<T>;
#define hfor(v, s, e) for(int v=(s);(s)<=v&&v<(e);++v)//half-opened range
#define hfori(v, s, e) for(int v=(e)-1;(s)<=v&&v<(e);--v)//inversion
#define hforo(v, s, e) int v=(s);for(;(s)<=v&&v<(e);++v)//out declaration
#define hforoi(v, s, e) int v=(e)-1; for(;(s)<=v&&v<(e);--v)
#define cfor(v, s, e) hfor(v,(s),(e)+1)//closed range
#define cfori(v, s, e) hfori(v,(s),(e)+1)
#define cforo(v, s, e) hforo(v,(s),(e)+1)
#define cforoi(v, s, e) hforoi(v,(s),(e)+1)
#define rep(v,x) hfor(v,0,(x))
#define repi(v,x) hfori(v,0,(x))
#define repo(v,x) hforo(v,0,(x))
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define pushb push_back
#define pushf push_front
#define popb pop_back
#define popf pop_front
#define empl emplace
#define emplb emplace_back
#define emplf emplace_front
#define fi first
#define se second
#define cxp constexpr
#define PQ std::priority_queue

#ifndef DEBUG
	#pragma GCC optimize ("Ofast")
	auto __PRE_RUN__=(ios::sync_with_stdio(0), cin.tie(0), cout.tie(0),(cout<<fixed<<setprecision(11)), 0);
#endif

template<typename T> cxp T inf() { return numeric_limits<T>::max() / 2; }
auto mapf(auto a, auto f){for(auto& x:a)x=f(x); return a;}
int rd(int lb, int ub){static mt19937 rng(time(0)^i64(new int)); return uniform_int_distribution<int>(lb, ub-1)(rng);}
int rd(int ub=inf<int>()){return rd(0,ub);}
const f64 pi=acosl(-1);
#define endl '\n'//not interactive?
#define int i64//MLE?
using pint = pair<int,int>;
using tint = tuple<int,int,int>;

const int N=200000;
int n,k;
Arr<pint> t[N];
int s[N];
int d[N];

int ct(int v, int sz_tot){
	int mx=-1;
	for(auto i:t[v])
		if(!d[i.fi] and (mx<0 or s[mx]<s[i.fi]))
			mx=i.fi;

	if(mx<0 or s[mx]*2<=sz_tot)
		return v;
	d[v]++;
	int ret=ct(mx, sz_tot);
	d[v]--;
	return ret;
}

int recalc(int v){
	d[v]++;
	s[v]=1;
	for(auto i:t[v])
		if(!d[i.fi])
			s[v]+=recalc(i.fi);
	d[v]--;
	return s[v];
}

void get_paths(int v, int dist, int cnt, multiset<pint>& z){
	z.insert({dist,cnt});
	if(d[v])
		return;
	d[v]++;
	for(auto i:t[v])
		if(!d[i.fi])
			get_paths(i.fi, dist+i.se, cnt+1, z);
	d[v]--;
}

int f(int v){
	recalc(v);
	v=ct(v, s[v]);

	d[v]++;
	int ret=inf<int>();

	multiset<pint> z;
	z.insert({0,0});
	for(auto i:t[v]){
		multiset<pint> y;
		if(!d[i.fi])
			get_paths(i.fi, i.se, 1, y);

		for(auto j:y){
			auto it = z.lower_bound({k-j.fi,0});
			if(it!=z.end() and it->fi==k-j.fi)
				ret=min(ret, j.se+it->se);
		}
		z.insert(all(y));
	}

	for(auto i:t[v])
		if(!d[i.fi])
			ret=min(ret, f(i.fi));
	//d[v]--;
	return ret;
}

#include "race.h"
signed best_path(signed N, signed K, signed H[][2], signed L[])
{
   	n=N;k=K;
  	rep(i,n-1){
		t[H[i][0]].push_back({H[i][1],L[i]});
		t[H[i][1]].push_back({H[i][0],L[i]});
	}
    int ans=f(0);
	return ans==inf<int>()?-1:ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...