제출 #520298

#제출 시각아이디문제언어결과실행 시간메모리
520298new_accRace (IOI11_race)C++14
100 / 100
670 ms52008 KiB
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=2e5+10;
vector<pair<int,int> >graf[N];
int pod[N];
pair<pair<int,int>,pair<int,int> >t[1000*1000+10];
bool vis[N];
int cn;
int res=INT_MAX;
int dfspod(int v,int o){
	int res=0;
	for(auto u:graf[v]){
		if(vis[u.fi]||u.fi==o) continue;
		res+=dfspod(u.fi,v);
	}	
	return res+1;
}
void dfs(int v,int o,int s){
	bool b=1;
	pod[v]=0;
	for(auto u:graf[v]){
		if(vis[u.fi]||o==u.fi) continue;
		dfs(u.fi,v,s);
		pod[v]+=pod[u.fi];
		if(pod[u.fi]>s/2) b=0;
	}
	pod[v]++;
	if(s-pod[v]>s/2) b=0;
	if(b) cn=v;
} 
void dfs2(int v,int o,int g,int odl,bool b,int k){
	if(g>1000*1000) return;
	if(b==0) t[g].fi.fi=0,t[g].fi.se=0,t[g].se.fi=0,t[g].se.se=0;
	else if(t[g].fi.fi>odl||t[g].fi.fi==0) t[g].fi={odl,k};
	for(auto u:graf[v]){
		if(vis[u.fi]||o==u.fi) continue;
		dfs2(u.fi,v,g+u.se,odl+1,b,k);
	}
}
void dfs3(int v,int o,int g,int odl,int k){
	if(g>1000*1000) return;
	if(t[g].fi.se!=k&&(t[g].se.fi>odl||t[g].se.fi==0)) t[g].se={odl,k};
	for(auto u:graf[v]){
		if(vis[u.fi]||o==u.fi) continue;
		dfs3(u.fi,v,g+u.se,odl+1,k);
	}	
}
void dfs_wyn(int v,int o,int g,int odl,int k,int kk){
	if(g>k) return;
	if(g==k) res=min(res,odl);
	if(t[k-g].fi.se!=kk&&t[k-g].fi.fi!=0) res=min(res,t[k-g].fi.fi+odl);
	if(t[k-g].se.se!=kk&&t[k-g].se.fi!=0) res=min(res,t[k-g].se.fi+odl);
	for(auto u:graf[v]){
		if(vis[u.fi]||o==u.fi) continue;
		dfs_wyn(u.fi,v,g+u.se,odl+1,k,kk);
	}
}
void decomp(int v,int k){
	if(vis[v]) return;
	int s=dfspod(v,v);
	dfs(v,v,s);
	for(auto u:graf[cn]){
		if(vis[u.fi]) continue;
		dfs2(u.fi,cn,u.se,1,1,u.fi);
	}
	for(auto u:graf[cn]){
		if(vis[u.fi]) continue;
		dfs3(u.fi,cn,u.se,1,u.fi);
	}
	for(auto u:graf[cn]){
		if(vis[u.fi]) continue;
		dfs_wyn(u.fi,cn,u.se,1,k,u.fi);
	}
	for(auto u:graf[cn]){
		if(vis[u.fi]) continue;
		dfs2(u.fi,cn,u.se,1,0,u.fi);
	}
	int cc=cn;
	vis[cc]=1;
	for(auto u:graf[cc]) decomp(u.fi,k);
}
int best_path(int n,int k,int h[][2],int l[]){
	for(int i=0;i<=n-2;i++) h[i][0]++,h[i][1]++,graf[h[i][0]].push_back({h[i][1],l[i]}),graf[h[i][1]].push_back({h[i][0],l[i]});
	decomp(1,k);
	if(res==INT_MAX) 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...