Submission #162557

#TimeUsernameProblemLanguageResultExecution timeMemory
162557kostia244경주 (Race) (IOI11_race)C++14
100 / 100
2458 ms73196 KiB
#define _GLIBCXX_DEBUG
#include "race.h"
#include<bits/stdc++.h>
#define pb push_back
#define all(x) x.begin(), x.end()
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using pi = pair<int, int>;
int table[1000100];
vi used;
int get(int x) {
	if(x<0||x>1000100) return table[1000091];
	return table[x];
}
void mset(int x, int y) {
	if(x<0||x>1000100) return;
	table[x] = min(table[x], y);
	used.pb(x);
}
void clear() {
	for(auto i : used)
		table[i] = table[1000091];
	table[0] = 0;
	used.clear();
}
int n, k, ans = 10000001;
vector<vector<pi>> g;
vi sz, maxch, comp;
bitset<300300> is_centroid;
void sizes(int v, int p) {
	sz[v]=1, maxch[v]=0;
	comp.pb(v);
	for(auto ii : g[v]) {
		int i = ii.first;
		if(!is_centroid.test(i)&&i!=p)
			sizes(i, v), sz[v] += sz[i], maxch[v] = max(maxch[v], sz[i]);
	}
}
void dfsg(int v, int p, int d = 0, int vl = 0) {
	if(vl>k) return;
	ans = min(ans, d+get(k-vl));
	for(auto ii : g[v]) {
		int i = ii.first, c = ii.second;
		if(is_centroid.test(i)||i==p) continue;
		dfsg(i, v, d+1, vl+c);
	}
}
void dfss(int v, int p, int d = 0, int vl = 0) {
	if(vl>k) return;
	mset(vl, d);
	for(auto ii : g[v]) {
		int i = ii.first, c = ii.second;
		if(is_centroid.test(i)||i==p) continue;
		dfss(i, v, d+1, vl+c);
	}
}
void decompose(int v) {
	comp.clear();
	sizes(v, v);
	int c = comp[0];
	for(auto i : comp) {
		maxch[i] = max(maxch[i], (int)comp.size()-sz[i]);
		if(maxch[i]<maxch[c])c=i;
	}
	for(auto ii : g[c]) {
		int i = ii.first, cst = ii.second;
		if(is_centroid.test(i)) continue;
		dfsg(i, c, 1, cst);
		dfss(i, c, 1, cst);
	}
	clear();
	is_centroid.set(c);
	for(auto ii : g[c]) {
		int i = ii.first;
		if(!is_centroid.test(i))
			decompose(i);
	}
}

int best_path(int N, int K, int H[][2], int L[])
{
	memset(table, 0x3f, sizeof table), table[0] = 0;
	n=N,k=K;
	g.resize(n);
	sz.resize(n);
	maxch.resize(n);
	for(int i = 0; i+1 < n; i++) {
		g[H[i][0]].pb({H[i][1], L[i]});
		g[H[i][1]].pb({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...