제출 #1367215

#제출 시각아이디문제언어결과실행 시간메모리
1367215temurbek1371Race (IOI11_race)C++20
0 / 100
2 ms4384 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;
int ans = 1e9;
constexpr int N = 2e5+3;
bool vis[N];
int sz[N];
pair<int,int> dep[N];
vector<pair<int,int>> g[N];
int n,k;
void getsz(int v,int p){
	sz[v]=1;
	for(auto [i,tm]:g[v]){
		if(i!=p && !vis[i]){
			getsz(i,v);
			sz[v]+=sz[i];
		}
	}
}
int getcent(int v,int p,int ttl){
	for(auto [i,tm]:g[v]){
		if(i!=p && !vis[i] && sz[i]>ttl/2)return getcent(i,v,ttl);
	}
	return v;
}
int ctr = 0;
void getdep(int v,int p,int cd,int cl){
	stack<array<int,4>> st;
	st.push({v,p,cd,cl});
	while(!st.empty()){
		auto [vi,pi,cdi,cli]=st.top();st.pop();
		dep[ctr++]={cdi,cli};
		for(auto [ui,li]:g[vi]){
			if(!vis[ui] && ui!=pi && cdi+1<ans && cli+li<=k)st.push({ui,vi,cdi+1,cli+li});
		}
	}
}
int lu[(int)1e6+2],mn[(int)1e6+2];
void solvecent(int v){
	getsz(v,-1);
	int c = getcent(v,-1,sz[v]);
	vis[c]=1;
	lu[0]=c;
	mn[0]=0;
	for(auto [i,li]:g[c]){
		ctr = 0;
		getdep(i,c,1,li);
		for(int j = 0;j<ctr;j++){
			auto [dp,ln]=dep[j];
			if(lu[k-ln]==c)ans = min(ans,mn[k-ln]+dp);
		}
		for(int j = 0;j<ctr;j++){
			auto [dp,ln]=dep[j];
			if(lu[ln]!=c)lu[ln]=c,mn[ln]=1e9;
			mn[ln] = min(mn[ln],dp);
		}
	}
	for(auto [i,li]:g[c]){
		if(!vis[i])solvecent(i);
	}
}
int best_path(int ni, int ki, int H[][2], int L[])
{
	for(int i = 0;i<ni-1;i++)g[H[i][0]].push_back({H[i][1],L[i]}),g[H[i][1]].push_back({H[i][0],L[i]});
	n = ni,k = ki;
	memset(lu,-1,sizeof(lu));
	solvecent(0);
	return (ans==1e9?-1:ans);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…