Submission #226760

#TimeUsernameProblemLanguageResultExecution timeMemory
226760staniewzkiRace (IOI11_race)C++17
100 / 100
1154 ms42872 KiB
#include<bits/stdc++.h>
using namespace std;
 
#define REP(i, n) for(int i = 0; i < n; i++)
#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define ST first
#define ND second
 
ostream& operator<<(ostream &out, string str) {
	for(char c : str) out << c;
	return out;
}
 
template<class L, class R> ostream& operator<<(ostream &out, pair<L, R> p) {
	return out << "(" << p.ST << ", " << p.ND << ")";
}
 
template<class T> auto operator<<(ostream &out, T a) -> decltype(a.begin(), out) {
	out << "{";
	for(auto it = a.begin(); it != a.end(); it = next(it))
		out << (it != a.begin() ? ", " : "") << *it;
	return out << "}";
}
 
void dump() { cerr << "\n"; }
template<class T, class... Ts> void dump(T a, Ts... x) {
	cerr << a << ", ";
	dump(x...);
}
 
#ifdef DEBUG
#  define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
#else
#  define debug(...) false
#endif
 
template<class T> int size(T && a) { return (int) a.size(); }
 
using LL = long long;
using PII = pair<int, int>;

#include "race.h"

int best_path(int n, int k, int h[][2], int l[]) {
	vector<vector<PII>> adj(n);
	REP(i, n - 1) {
		adj[h[i][0]].emplace_back(h[i][1], l[i]);
		adj[h[i][1]].emplace_back(h[i][0], l[i]);
	}

	vector<int> sub(n), del(n);
	function<void(int, int)> get_sub = [&](int v, int p) {
		sub[v] = 1;
		for(auto &[u, w] : adj[v]) {
			if(u != p && !del[u]) {
				get_sub(u, v);
				sub[v] += sub[u];
			}
		}
	};

	function<int(int, int, int)> get_centro = [&](int v, int p, int tree) {
		bool is_centro = true;
		if((tree - sub[v]) * 2 > tree)
			is_centro = false;
		for(auto &[u, w] : adj[v]) {
			if(u != p && !del[u]) {
				int r = get_centro(u, v, tree);
				if(r != -1) return r;
				if(sub[u] * 2 > tree) 
					is_centro = false;
			}
		}
		if(is_centro) return v;
		return -1;
	};

	int inf = 1e9, ans = inf;
	vector<int> opt(k + 1, inf);

	function<void(int, int, int, int, int)> get_ans = [&](int v, int p, int dep, int dst, int type) {
		if(dst > k) return;
		if(type == 1) ans = min(ans, dep + opt[k - dst]);
		if(type == 2) opt[dst] = min(opt[dst], dep);
		if(type == 3) opt[dst] = inf;
		for(auto &[u, w] : adj[v])
			if(u != p && !del[u])
				get_ans(u, v, dep + 1, dst + w, type);
	};

	function<void(int)> decomp = [&](int v) {
		get_sub(v, -1);
		v = get_centro(v, -1, sub[v]);
		opt[0] = 0;
		for(auto &[u, w] : adj[v]) if(!del[u]) {
			get_ans(u, v, 1, w, 1);
			get_ans(u, v, 1, w, 2);
		}
		for(auto &[u, w] : adj[v]) if(!del[u])
			get_ans(u, v, 1, w, 3);
		del[v] = true;
		for(auto &[u, w] : adj[v]) if(!del[u])
			decomp(u);
	};

	decomp(0);
	if(ans >= inf) ans = -1;
	return ans;
}

Compilation message (stderr)

race.cpp: In lambda function:
race.cpp:54:18: warning: unused variable 'w' [-Wunused-variable]
   for(auto &[u, w] : adj[v]) {
                  ^
race.cpp: In lambda function:
race.cpp:66:18: warning: unused variable 'w' [-Wunused-variable]
   for(auto &[u, w] : adj[v]) {
                  ^
race.cpp: In lambda function:
race.cpp:102:18: warning: unused variable 'w' [-Wunused-variable]
   for(auto &[u, w] : adj[v]) if(!del[u])
                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...