Submission #234675

#TimeUsernameProblemLanguageResultExecution timeMemory
234675kshitij_sodaniRace (IOI11_race)C++17
100 / 100
751 ms63316 KiB
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef int64_t llo;
#include "race.h"
#define a first 
#define pb push_back
#define b second
pair<int,int> aa[1000001];
pair<int,int> bb[1000001];
int ss[200001];
set<pair<int,int>> adj[200001];
int cur;
vector<int> del;
int k;
int ans=-1;
void dfs(int no,int par=-1){
	ss[no]=1;
	for(auto j:adj[no]){
		if(j.a!=par){
			dfs(j.a,no);
			ss[no]+=ss[j.a];
		}
	}
}
int dfs2(int no,int par=-1){
	for(auto j:adj[no]){
		if(j.a==par){
			continue;
		}
		if(ss[j.a]>ss[cur]/2){
			return dfs2(j.a,no);
		}
	}
	return no;
}
void dfs3(int no,int par2,int par=-1,int lev=0,int ww=0){
	if(lev==1){
		par2=no;
	}
	if(ww<=k){

		del.pb(ww);
		if(aa[ww].a==-1){
			aa[ww]={par2,lev};
		}
		else if(aa[ww].a==par2){
			aa[ww].b=min(aa[ww].b,lev);
		}
		else if(aa[ww].b>lev){
			bb[ww]=aa[ww];
			aa[ww]={par2,lev};
		}
		else if(bb[ww].a==-1){
			bb[ww]={par2,lev};
		}
		else if(bb[ww].a==par2){
			bb[ww].b=min(bb[ww].b,lev);
		}
		else if(lev<bb[ww].b){
			bb[ww]={par2,lev};
		}
		if(aa[ww].a!=-1 and aa[k-ww].a!=-1){
			if(aa[ww].a!=aa[k-ww].a){
				if(ans==-1){
					ans=aa[ww].b+aa[k-ww].b;
				}
				ans=min(ans,aa[ww].b+aa[k-ww].b);
			}
		}
		if(aa[ww].a!=-1 and bb[k-ww].a!=-1){
			if(aa[ww].a!=bb[k-ww].a){
				if(ans==-1){
					ans=aa[ww].b+bb[k-ww].b;
				}
				ans=min(ans,aa[ww].b+bb[k-ww].b);
			}
		}
		if(bb[ww].a!=-1 and aa[k-ww].a!=-1){
			if(bb[ww].a!=aa[k-ww].a){
				if(ans==-1){
					ans=bb[ww].b+aa[k-ww].b;
				}
				ans=min(ans,bb[ww].b+aa[k-ww].b);
			}
		}
		if(bb[ww].a!=-1 and bb[k-ww].a!=-1){
			if(bb[ww].a!=bb[k-ww].a){
				if(ans==-1){
					ans=bb[ww].b+bb[k-ww].b;
				}
				ans=min(ans,bb[ww].b+bb[k-ww].b);
			}
		}
	}

	for(auto j:adj[no]){
		if(j.a==par){
			continue;
		}
		dfs3(j.a,par2,no,lev+1,ww+j.b);

	}
}
void dec(int no){
	cur=no;
	dfs(no);
	//return;
	int cen=dfs2(no);

	dfs3(cen,cen);
	for(auto j:del){
		aa[j]={-1,-1};
		bb[j]={-1,-1};
	}
	del.clear();
	for(auto j:adj[cen]){
		adj[j.a].erase({cen,j.b});
	}
	for(auto j:adj[cen]){
		dec(j.a);
	}
	return;
}

int best_path(int n,int kk,int h[][2],int l[]){
	k=kk;
	for(int i=0;i<=k;i++){
		aa[i]={-1,-1};
		bb[i]={-1,-1};
	}
	for(int i=0;i<n-1;i++){
		adj[h[i][0]].insert({h[i][1],l[i]});
		adj[h[i][1]].insert({h[i][0],l[i]});
	}
	dec(0);
	return ans;
}

/*int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n,ko;
	cin>>n>>ko;
	int hh[n-1][2];
	int lol[n-1];
	for(int i=0;i<n-1;i++){
		cin>>hh[i][0]>>hh[i][1]>>lol[i];
	}
	cout<<best_path(n,ko,hh,lol)<<endl;
	return 0;
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...