Submission #1167912

#TimeUsernameProblemLanguageResultExecution timeMemory
1167912bluevioletRace (IOI11_race)C++20
100 / 100
376 ms68992 KiB
#include     		<bits/stdc++.h>
	
#define             ll   long long
#define            pll   pair<ll, ll>
#define            pii   pair<int, int>
#define          io(x)   if (fopen(x".inp","r")) {freopen(x".inp","r",stdin),freopen(x".out","w",stdout);}
#define      mem(c, x)   memset(c, x, sizeof(c))
#define         all(c)   c.begin(), c.end()
#define       bit(i,j)   ((i >> j) & 1)
#define             pb   push_back
#define             se   second     
#define             fi   first
#define             el   '\n'
using namespace std;  

template<class T> bool   maximize(T &a, const T &b) { return (a < b ? a = b, 1 : 0); }
template<class T> bool   minimize(T &a, const T &b) { return (a > b ? a = b, 1 : 0); }

int dx[8] = {0, 1, 0,-1, 1, 1,-1,-1};
int dy[8] = {1, 0,-1, 0, 1,-1,-1, 1};
const int  maxn  = 2e5 + 9;
const int  Inf   = 2e9 + 7;
const ll   Infll = 1e18 + 9;
const ll   Mod   = 1e9 + 7;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int n, k;
vector<pii> adj[maxn];	ll sum[maxn];
int h[maxn], sz[maxn], res = 0x3f3f3f3f;
map<ll, int> mp;
vector<int> vec[maxn];

void dfs(int u, int par) { 
	sz[u] = 1;
	for (auto x : adj[u]) {
		int v = x.fi, w = x.se;
		if (v == par) continue;
		sum[v] = sum[u] + w;
		h[v] = h[u] + 1;
		dfs(v, u);
		sz[u] += sz[v];
	}
}
void sack(int u, int par, bool keep) {
	int hevNode = 0;
	for (auto v : adj[u]) {
		if (v.fi == par) continue;
		if (!hevNode || sz[hevNode] < sz[v.fi]) {
			hevNode = v.fi;
		}
	}
	for (auto v : adj[u]) {
		if (v.fi == par || v.fi == hevNode) continue;
		sack(v.fi, u, 0);
	}
	if (hevNode) {
		sack(hevNode, u, 1);
		swap(vec[hevNode], vec[u]);
	}
	vec[u].pb(u);
	if (mp.find(sum[u]) == mp.end()) mp[sum[u]] = 0x3f3f3f3f;
	minimize(mp[sum[u]], h[u]);

	if (mp.find(k + sum[u]) != mp.end()) 
		minimize(res, mp[k + sum[u]] - h[u]);

	for (auto z : adj[u]) {
		int v = z.fi, w = z.se;
		if (v == par || v == hevNode) continue;
		for (int x : vec[v]) {
			if (mp.find(k + 2ll*sum[u] - sum[x]) != mp.end()) 
				minimize(res, h[x] - 2*h[u] + mp[k + 2ll*sum[u] - sum[x]]);
		}
		for (int x : vec[v]) {
			vec[u].pb(x);
			if (mp.find(sum[x]) == mp.end()) mp[sum[x]] = 0x3f3f3f3f;
			minimize(mp[sum[x]], h[x]);
		}
	}
	if (!keep) {
		mp.clear();
	}
}
int best_path(int N, int K, int H[][2], int L[]) {
	n = N; k = K;
	for (int i=0; i<n-1; i++) {
		int x = H[i][0] + 1; 
		int y = H[i][1] + 1; 
		int w = L[i]; 
		adj[x].pb({y, w});
		adj[y].pb({x, w});
	}
	dfs(1, 1);
	sack(1, 1, 1);
	if (res == 0x3f3f3f3f) return -1; 
	return res;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...