Submission #387928

#TimeUsernameProblemLanguageResultExecution timeMemory
387928ritul_kr_singhRace (IOI11_race)C++17
0 / 100
10 ms15564 KiB
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define sp << ' ' <<
#define nl << '\n'
#define v e.first
#define w e.second
#include "race.h"

const int MAXN = 2e5;

int ans = 1e9, k;

vector<vector<pair<int, int>>> g(MAXN);
vector<int> s(MAXN);
vector<bool> r(MAXN);

vector<map<int, int>> d(MAXN);

int calcSize(int u, int p){
	s[u] = 0;
	for(auto &e : g[u]) if(v != p and !r[v]) s[u] += calcSize(v, u);
	return s[u];
}

void calcDist(int u, int p, int currLength, int currDist, int root){
	int &x = d[root][currDist];
	if(!x) x = currLength+1;
	else x = min(x, currLength+1);

	for(auto &e : g[u]) if(v != p and !r[v]) calcDist(v, u, currLength, currDist+w, root);
}

void dfs(int u, int p, int currLength, int currDist, int root){
	if(d[root][k-currDist]) ans = min(ans, d[root][k-currDist] + currLength);

	for(auto &e : g[u]) if(v != p and !r[v]) dfs(v, u, currLength+1, currDist+w, root);
}

int find(int u, int p, int treeSize){
	for(auto &e : g[u]) if(v != p and !r[v] and s[v] > treeSize/2) return find(v, u, treeSize);
	return u;
}

void decompose(int u){
	int c = find(u, u, calcSize(u, u));
	r[u] = 1;
	for(auto &e : g[c]){
		if(r[v]) continue;
		dfs(v, c, 1, w, c);
		calcDist(v, c, 1, w, c);
	}
	if(d[c][k]) ans = min(ans, d[c][k]);
	for(auto &e : g[c]) if(!r[v]) decompose(v);
}


int best_path(int N, int K, int H[][2], int L[]){
	k = K;
	for(int i=0; i<N-1; ++i){
		g[H[i][0]].emplace_back(H[i][1], L[i]);
		g[H[i][1]].emplace_back(H[i][0], L[i]);
	}
	decompose(0);
	if(ans>N) ans = -1;
	return 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...