Submission #398072

#TimeUsernameProblemLanguageResultExecution timeMemory
398072AntekbRace (IOI11_race)C++14
100 / 100
1051 ms48420 KiB
#include "race.h"
#include<bits/stdc++.h>
using namespace std;
#define st first
#define nd second
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef vector<int> vi;
typedef long long ll;
typedef pair<int, int> pii;
const int N=2e5+5;
vi w, to, uzy;
vi E[N];
int siz[N], dep[N];
ll d[N];
const int M=1e6+5;
int dist[M], dist2[M], opt[M];
int k, cent, ans=N;
void dfs_siz(int v, int p, int n){
	siz[v]=1;
	bool czy=1;
	for(int i:E[v]){
		if(to[i]!=p && !uzy[i]){
			dfs_siz(to[i], v, n);
			siz[v]+=siz[to[i]];
			if(2*siz[to[i]]>n)czy=0;
		}
	}
	if(2*(n-siz[v])>n)czy=0;
	if(czy)cent=v;
	//cout<<v<<" "<<siz[v]<<"\n";
}
int dfs_calc(int v, int p, int anc){
	//cout<<v<<" "<<dep[v]<<" "<<d[v]<<"\n";
	int res=1;
	if(d[v]<=k && (dist[d[v]]==0 || dist[d[v]]>dep[v])){
		if(opt[d[v]]!=anc)dist2[d[v]]=dist[d[v]];
		dist[d[v]]=dep[v];
		opt[d[v]]=anc;
	}
	if(k>=d[v] && dist[k-d[v]]!=0 && opt[k-d[v]]!=anc)ans=min(ans, dep[v]+dist[k-d[v]]);
	if(k>=d[v] && dist2[k-d[v]]!=0)ans=min(ans, dep[v]+dist2[k-d[v]]);
	if(k==d[v])ans=min(ans, dep[v]);
	for(int i:E[v]){
		if(to[i]!=p && !uzy[i]){
			dep[to[i]]=dep[v]+1;
			d[to[i]]=d[v]+w[i];
			res+=dfs_calc(to[i], v, anc);
		}
	}
	return res;
}
void dfs_clear(int v, int p){
	if(d[v]<=k){
		dist[d[v]]=dist2[d[v]]=opt[d[v]]=0;
	}
	for(int i:E[v]){
		if(!uzy[i] && to[i]!=p){
			dfs_clear(to[i], v);
		}
	}
}
void decomp(int v, int n){
	//cout<<v<<" "<<n<<"a\n";
	if(n==1)return;
	cent=-1;
	dfs_siz(v, 0, n);
	assert(cent>0);
	//cout<<cent<<"\n";
	for(int i:E[cent]){
		if(!uzy[i]){
			dep[to[i]]=1;
			d[to[i]]=w[i];
			siz[to[i]]=dfs_calc(to[i], cent, to[i]);
		}
	}
	int C=cent;
	dfs_clear(C, 0);
	for(int i:E[C]){
		if(!uzy[i]){
			uzy[i]=1;
			uzy[i^1]=1;
			decomp(to[i], siz[to[i]]);
		}
	}
}
int best_path(int n, int _k, int H[][2], int L[])
{
	k=_k;
	for(int i=0; i<n-1; i++){
		H[i][0]++;
		H[i][1]++;
		E[H[i][0]].pb(to.size());
		to.pb(H[i][1]);
		E[H[i][1]].pb(to.size());
		to.pb(H[i][0]);
		w.pb(L[i]);
		w.pb(L[i]);
	}
	uzy.resize(w.size());
	decomp(1, n);
	return ((ans==N) ? -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...