Submission #898114

#TimeUsernameProblemLanguageResultExecution timeMemory
898114ThylOneRace (IOI11_race)C++14
0 / 100
2 ms8796 KiB
#include "race.h"
#include<bits/stdc++.h>
using namespace std;
const int maxiN = 200000;
#define edge pair<int,int>
#define fils first
#define weight second

vector<edge> links[maxiN];
vector<bool> blocked;
int nbNode;
int target;
int ANS = maxiN*2;
vector<pair<int,int>>  solve(int node,int W=0){
  //1 - trouver la centroid
  map<int,int> sub_tree;
  vector<int> nodes;
  map<int,vector<int>> subsub;
  std::function<int(int, int)> dfs = [&](int node_,int papa=-1){
    if(blocked[node_])return 0;
    nodes.push_back(node_);
    for(auto e:links[node_])if(papa!=e.fils){
      int re = dfs(e.fils,node_);
      subsub[node_].push_back(re);
      sub_tree[node_]+=re;
    }
    sub_tree[node_]++;
    return sub_tree[node_];
  };
  dfs(node,-1);
  int miniDiff = maxiN+42;
  int centroid = nodes[0];
  for(int nc:nodes){
    bool ok;
    int maxiDist=0;
    int sizeC = nodes.size();
    int maxSub = sizeC/2;
    for(int d:subsub[nc]){
      maxiDist=max(maxiDist,(d<maxSub?0:abs(maxSub-d)));
    }
    if(nc!=node){
      int rest = sizeC-sub_tree[nc];
      maxiDist=max(maxiDist,(rest<maxSub?0:abs(maxSub-rest)));
    }  
    if(miniDiff>maxiDist){
      miniDiff=maxiDist;
      centroid=nc;
    }
  }
  blocked[centroid]=true;
  //2 Divide
  map<int,int> val;
  vector<int> mid;
  for(auto e:links[centroid])if(!blocked[e.first]){
    vector<pair<int,int>> re = solve(e.fils,e.weight);
    for(auto r:re){
      if(r.first == target/2 && target%2==0)mid.push_back(r.second);
      //On stock le meilleur repréentant pour chaque valeur
      if(val.count(r.first)){
        val[r.first] = min(val[r.first],r.second);
      }else{
        val[r.first] = r.second;
      }
    }
  }
  //3 Conquer
  // On regarde si on a pas trouvé un chemin
  sort(mid.begin(),mid.end());
  if(mid.size()>1){
    ANS = min(ANS,mid[0]+mid[1]);
  }
  //On en profite pour remplir le vecteur de fin
  vector<pair<int,int>> returnPairs;
  for(auto key:val){
    returnPairs.push_back({key.first+W,key.second+1});
    if(key.first==target){
      ANS = min(ANS,key.second);
    }else if(val.count(target-key.first)){
      ANS = min(ANS,(int)(key.second+val[target-key.first]));
    }
  }

  //On oublit pas la ptit nouvelle
  returnPairs.push_back({W,1});
  return returnPairs;
}
int best_path(int N, int K, int H[][2], int L[])
{
  target=K;
  nbNode=N;
  
  blocked.resize(N,false);
  fill(blocked.begin(),blocked.end(),false);
  for(int i = 0;i<N-1;i++){
    links[H[i][0]].push_back({H[i][1],L[i]});
    links[H[i][1]].push_back({H[i][0],L[i]});
  }
  
  solve(0);
  
  return (ANS==2*maxiN?-1:ANS);
}

Compilation message (stderr)

race.cpp: In function 'std::vector<std::pair<int, int> > solve(int, int)':
race.cpp:34:10: warning: unused variable 'ok' [-Wunused-variable]
   34 |     bool ok;
      |          ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...