Submission #445260

#TimeUsernameProblemLanguageResultExecution timeMemory
445260prvocisloRace (IOI11_race)C++17
100 / 100
1029 ms41840 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
int n, k, ans = maxn;
vector<bool> alive(maxn, true);
vector<int> siz(maxn, 0);
vector<vector<pair<int, int> > > g(maxn);
void dfs_size(int u, int p = -1)
{
  siz[u] = 1;
  for (pair<int, int> i : g[u])
  {
    if (!alive[i.first] || i.first == p) continue;
    dfs_size(i.first, u);
    siz[u] += siz[i.first];
  }
}
int dfs_centroid(int u, int s, int p = -1)
{
  for (const pair<int, int> &i : g[u])
  {
    if (!alive[i.first] || i.first == p) continue;
    if (siz[i.first] > s/2) return dfs_centroid(i.first, s, u);
  }
  return u;
}
void dfs_dist(int u, vector<pair<int, int> > &v, int depth = 0, int dist = 0, int p = -1)
{
  if (dist == k) return (void)(ans = min(ans, depth));
  if (dist > k) return;
  v.push_back({dist, depth});
  for (pair<int, int> i : g[u])
  {
    if (!alive[i.first] || i.first == p) continue;
    dfs_dist(i.first, v, depth+1, dist+i.second, u);
  }
}
void centroid_decomp(int r)
{
  dfs_size(r);
  int u = dfs_centroid(r, siz[r]);
  map<int, int> m;
  alive[u] = false;
  for (const pair<int, int> &i : g[u])
  {
    if (!alive[i.first]) continue;
    centroid_decomp(i.first);
    vector<pair<int, int> > v;
    dfs_dist(i.first, v, 1, i.second, u);
    for (const pair<int, int> &j : v) 
    {
      //cout << m.count(k-j.first) << " " << m[k-j.first] << "\n";
      if (m.count(k-j.first)) 
        ans = min(ans, j.second+m[k-j.first]);
    }
    for (const pair<int, int> &j : v)
      if (!m.count(j.first))
        m[j.first] = j.second;
      else
        m[j.first] = min(m[j.first], j.second);
    //cout << "\n" << u << "\n";
    //for (pair<int, int> j : m) cout << j.first << " " << j.second << "\n";
  }
  alive[u] = true;
}
int best_path(int N, int K, int e[][2], int l[])
{
  n = N, k = K;
  for (int i = 0; i < n-1; i++)
  {
    g[e[i][0]].push_back({e[i][1], l[i]});
    g[e[i][1]].push_back({e[i][0], l[i]});
  }
  centroid_decomp(0);
  return ans == maxn ? -1 : 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...