제출 #1156930

#제출 시각아이디문제언어결과실행 시간메모리
1156930crispxx경주 (Race) (IOI11_race)C++20
100 / 100
663 ms43280 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;

// #include "grader.cpp"

#define all(x) x.begin(), x.end()

const int mxN = 2e5 + 5;

vector<pair<int, int>> adj[mxN];
map<long long, int> mp;
int sbz[mxN], del[mxN];

int k;

int ans = 1e9;

void dfs(int v, int p) {
	sbz[v] = 1;
	for(auto [to, w] : adj[v]) {
		if(to == p || del[to]) continue;
		dfs(to, v);
		sbz[v] += sbz[to];
	}
}

int Centroid(int v, int p, int size) {
	for(auto [to, w] : adj[v]) {
		if(to == p || del[to]) continue;
		if(sbz[to] * 2 > size) {
			return Centroid(to, v, size);
		}
	}
	return v;
}

void Ans(int v, int p, int d, long long cost) {
	if(mp.count(k - cost)) {
		ans = min(ans, d + mp[k - cost]);
	}
	for(auto [to, w] : adj[v]) {
		if(to == p || del[to]) continue;
		Ans(to, v, d + 1, cost + w);
	}
}

void Cnt(int v, int p, int d, long long cost) {
	if(mp.count(cost)) {
		mp[cost] = min(mp[cost], d);
	} else mp[cost] = d;
	for(auto [to, w] : adj[v]) {
		if(to == p || del[to]) continue;
		Cnt(to, v, d + 1, cost + w);
	}
}

void Decom(int v) {
	dfs(v, v);
	int C = Centroid(v, v, sbz[v]);
	
	mp.clear();
	
	mp[0] = 0;
	
	for(auto [to, w] : adj[C]) {
		if(del[to]) continue;
		Ans(to, C, 1, w);
		Cnt(to, C, 1, w);
	}
	
	del[C] = 1;
	
	for(auto [to, w] : adj[C]) {
		if(!del[to]) Decom(to);
	}
}

int best_path(int N, int K, int H[][2], int L[]) {
	k = K;
	for(int i = 0; i < N - 1; i++) {
		auto [u, v] = H[i];
		adj[u].emplace_back(v, L[i]);
		adj[v].emplace_back(u, L[i]);
	}
	
	Decom(0);
	
	return (ans == 1e9 ? -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...