제출 #697728

#제출 시각아이디문제언어결과실행 시간메모리
697728xuliu경주 (Race) (IOI11_race)C++17
100 / 100
481 ms107496 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;

#define ll long long 
#define debug if(0)

const int N = 2e5 + 4;
const int inf = 1e9+7;
vector<pair<int, ll>> V[N];
ll dist[N], depth[N], K;
map<ll, int> M[N]; // map [dist, depth]
ll ans = inf;

void dfs(int v, int p=-1) {
	M[v][dist[v]] = depth[v];
	for(auto e : V[v]) {
		int u = e.first; ll w = e.second;
		if(u != p) {
			dist[u] = dist[v]+w;
			depth[u] = depth[v]+1;
			dfs(u, v);
		}
	}
}

void dfs2(int v, int p=-1) {
	for(auto e : V[v]) {
		int u = e.first;
		if(u == p) continue;
		dfs2(u, v);
		if((int) M[v].size() < (int) M[u].size()) swap(M[v], M[u]);
		for(auto it = M[u].begin(); it != M[u].end(); ++it) {
			if(M[v].find((K+2LL*dist[v]-it->first)) != M[v].end()) { ans = min(ans, M[v][(K+2LL*dist[v]-it->first)]+it->second-2*depth[v]); }
		}
		for(auto it = M[u].begin(); it != M[u].end(); ++it) {
			if(M[v].find(it->first) != M[v].end()) M[v][it->first] = min(M[v][it->first], it->second);
			else M[v][it->first] = it->second;
		}
	}
}

int best_path(int n, int k, int h[][2], int l[]) {
	for(int i=0; i<(n-1); i++) {
		V[h[i][0]].push_back({h[i][1], l[i]});
		V[h[i][1]].push_back({h[i][0], l[i]});
	}
	K = k;
	dfs(0);
	dfs2(0);
	return (ans == inf ? -1 : (int) 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...