Submission #116278

#TimeUsernameProblemLanguageResultExecution timeMemory
116278dragonslayeritRace (IOI11_race)C++14
100 / 100
769 ms33260 KiB
#include "race.h"
#include <vector>
#include <map>
#include <stdint.h>

static const int INF=1e9+7;

static std::vector<std::pair<int,int> > adj[200005];
static int ans=INF;
static int size[200005];
static int KK;
static bool dead[200005];
static int best[1000005];

static int dfs_size(int node,int parent){
  size[node]=1;
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]||child==parent) continue;
    dfs_size(child,node);
    size[node]+=size[child];
  }
}

static int find_centroid(int node,int parent,int total_size){
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]||child==parent) continue;
    if(size[child]*2>total_size){
      return find_centroid(child,node,total_size);
    }
  }
  return node;
}

static void dfs_add(int node,int parent,int64_t dist,int len){
  if(dist>KK) return;
  best[dist]=std::min(best[dist],len);
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]||child==parent) continue;
    dfs_add(child,node,dist+e.second,len+1);
  }
}

static void dfs_test(int node,int parent,int64_t dist,int len){
  if(dist>KK) return;
  ans=std::min(ans,best[KK-dist]+len);
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]||child==parent) continue;
    dfs_test(child,node,dist+e.second,len+1);
  }
}

static void dfs_rem(int node,int parent,int64_t dist,int len){
  if(dist>KK) return;
  best[dist]=INF;
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]||child==parent) continue;
    dfs_rem(child,node,dist+e.second,len+1);
  }
}

static void solve(int node){
  dfs_size(node,node);
  node=find_centroid(node,node,size[node]);
  best[0]=0;
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]) continue;
    dfs_test(child,node,e.second,1);
    dfs_add(child,node,e.second,1);
  }
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]) continue;
    dfs_rem(child,node,e.second,1);
  }
  dead[node]=true;
  for(auto e:adj[node]){
    int child=e.first;
    if(dead[child]) continue;
    solve(child);
  }
}

int best_path(int N, int K, int H[][2], int L[])
{
  for(int i=0;i<N;i++){
    adj[i].clear();
  }
  ans=INF;
  std::fill(dead,dead+N,false);
  KK=K;
  std::fill(best,best+1000001,INF);
  for(int i=0;i<N-1;i++){
    adj[H[i][0]].emplace_back(H[i][1],L[i]);
    adj[H[i][1]].emplace_back(H[i][0],L[i]);
  }
  solve(0);
  return ans<INF?ans:-1;
}

Compilation message (stderr)

race.cpp: In function 'int dfs_size(int, int)':
race.cpp:23:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...