Submission #1288319

#TimeUsernameProblemLanguageResultExecution timeMemory
1288319m.zeeshanrashidRace (IOI11_race)C++20
100 / 100
280 ms83284 KiB
#ifdef __AVX2__
#pragma GCC target "avx2"
#endif
#pragma GCC optimize "O3"
#pragma GCC optimize "unroll-loops"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
using namespace std;
// #define int long long
#define elif else if
#define all(l) begin(l),end(l)
#define rall(l) rbegin(l),rend(l)
#define append push_back
#define print(l) for(auto i:l) cout<<i<<' '; cout<<endl;
#define pprint(a,b) cout<<a<<' '<<b<<endl;
#define inp(l) for(auto &i:l) cin>>i;
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define pai make_pair
#define endl "\n"
#define pii pair<int,int>
#define fi first
#define se second
#define vec vector

// const int mod=998244353;
const int mod1=998244353;
const int mod=1e9+7;
const int N=2e5+5;

set<pii>s[N];
vec<pii>G[N];
int dis[N],dep[N];
int n,k;

int dfs(int u,int p){
	int ans=1e9;
	s[u].insert({dis[u],dep[u]});
	int ind=-1,ma=-1;
	for(auto [v,w]:G[u]){
		if(v==p) continue;
		dis[v]=dis[u]+w;
		dep[v]=dep[u]+1;
		ans=min(ans,dfs(v,u));
		if((int)s[v].size()>ma){
			ind=v;
			ma=s[v].size();
		}
	}
	if(ma<0){
		// cout<<u<<endl;
		return ans;
	}
	swap(s[u],s[ind]);
	for(auto [v,w]:G[u]){
		if(v==p) continue;
		for(auto [x,y]:s[v]){
			if(x>dis[u]+k) continue;
			int g=(k-(x-dis[u]))+dis[u];
			pii idk={g,-1};
			auto it=s[u].lower_bound(idk);
			if(it==s[u].end()) continue;
			pii temp=*it;
			if(temp.fi==g) ans=min(ans,(y+temp.se)-dep[u]*2);
		}
		// if(u==1) cout<<"11 "<<v<<endl;
		for(auto [x,y]:s[v])
			s[u].insert({x,y});
	}
	return ans;
}

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 u=H[i][0],v=H[i][1],w=L[i];
  	G[u].append({v,w});
  	G[v].append({u,w});
  }
  int ans=dfs(0,-1);
  if(ans>n) return -1;
  return ans;
  // return 1;
}

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