Submission #786853

#TimeUsernameProblemLanguageResultExecution timeMemory
786853vjudge1Race (IOI11_race)C++17
0 / 100
14 ms27732 KiB
#include "bits/stdc++.h"
#include "race.h"
using namespace std;

#define ii pair<int,int>

const int ms = 1e6 + 5;

int sz[ms], dis[ms];
int n, sum, ans, k;
vector<ii> g[ms];


void put(int u, int p, int d, int qtd=0){
  if(d > k) return;
  dis[d] = min(dis[d], qtd);
  for(auto [v, w] : g[u]){
    if(v == p) continue;
    put(v, u, d+w, qtd+1);
  }
}

void qry(int u, int p, int d, int qtd=0){
  if(d > k) return;
  ans = min(ans, dis[d] + dis[k-d]);
  for(auto [v, w] : g[u]){
    if(v == p) continue;
    qry(v, u, d+w, qtd+1);
  }
}

void clean(int u, int p, int d){
  if(d > k) return;
  dis[d] = n + 100;
  for(auto [v, w] :g[u]){
    if(v == p) continue;
    clean(v, u, d +w);
  }
}


void dfs(int u, int p = -1, bool keep = false){
  int big = -1;
  for(auto [v, w] : g[u]){
    if(v == p) continue;
    if(big == -1 || sz[big] < sz[v]){
      big = v;
    }
  }

  for(auto [v, w] : g[u]){
    if(v == p || v == big) continue;
    dfs(v, u, false);
  }

  if(big != -1) dfs(big, u, true);


  for(auto [v, w] : g[u]){
    if(v == big || v == p) continue;
    qry(v, u, w, 1);
    put(v, u, w, 1);
  }


  if(!keep){
    clean(u, p, 0);
    dis[0] = 0;
  }

}

int getSz(int u=0, int p=-1){
  sz[u] = 1;
  for(auto [v, w] : g[u]){
    if(v == p) continue;
    sz[u] += getSz(v, u);
  }
  return sz[u];
}


int best_path(int N, int K, int H[][2], int L[]){
  k = K;
  n = N;
  for(int i=0; i<n-1; i++){
    g[H[i][0]].push_back({H[i][1], L[i]});
    g[H[i][1]].push_back({H[i][0], L[i]});
  }

  memset(dis, 0x3f, sizeof dis);
  dis[0] = 0;
  ans = n+ 100;
  getSz();
  dfs(0);

  if(ans > n){
    return -1;
  }
  return 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...