제출 #388446

#제출 시각아이디문제언어결과실행 시간메모리
388446pure_mem경주 (Race) (IOI11_race)C++14
100 / 100
1115 ms41756 KiB
#include "race.h"
#include <bits/stdc++.h>

#define X first
#define Y second
#define MP make_pair
#define ll long long

using namespace std;

const int MAXN = 2e5 + 12;

int answer, n, k, sz[MAXN], mx[MAXN];
map< int, int > act;
vector< pair< int, int > > graph[MAXN];
bool block[MAXN];

void dfs_sz(int v, int pr){
	sz[v] = 1, mx[v] = 0;
	for(pair<int, int> to: graph[v]){
		if(to.X != pr && !block[to.X]){
			dfs_sz(to.X, v), sz[v] += sz[to.X];
			if(sz[mx[v]] < sz[to.X])
				mx[v] = to.X;
		}
	}
}

int get_cent(int v){
	int u = v;
	while(sz[v] < sz[mx[u]] * 2)
		u = mx[u];
	return u;
}

void dfs_ans(int v, int pr, ll cost, int dist){
	if(cost > k)
		return;
	if(act.count(k - cost))
		answer = min(answer, dist + act[k - cost]);
	for(pair<int, int> to: graph[v]){
		if(to.X != pr && !block[to.X]){
			dfs_ans(to.X, v, cost + to.Y, dist + 1);
		}
	}
}

void dfs_add(int v, int pr, ll cost, int dist){
	if(cost > k)
		return;
	if(!act.count(cost) || act[cost] > dist)
		act[cost] = dist;
	for(pair<int, int> to: graph[v]){
		if(to.X != pr && !block[to.X]){
			dfs_add(to.X, v, cost + to.Y, dist + 1);
		}
	}
}

void cent(int v){
	dfs_sz(v, v), v = get_cent(v), block[v] = 1;	
	act[0] = 0;
	for(pair<int, int> to: graph[v]){
		if(!block[to.X])
			dfs_ans(to.X, v, to.Y, 1), dfs_add(to.X, v, to.Y, 1);
	}
	act.clear();
	for(pair<int, int> to: graph[v]){
		if(!block[to.X])
			cent(to.X);
	}
}

int best_path(int N, int K, int H[][2], int L[]){
	n = N, k = K, answer = MAXN;
	for(int i = 0;i < n - 1;i++){
		graph[H[i][1] + 1].push_back(MP(H[i][0] + 1, L[i]));
		graph[H[i][0] + 1].push_back(MP(H[i][1] + 1, L[i]));
	}
	cent(1);
	if(answer == MAXN)
		answer = -1;
	return answer;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...