Submission #1291994

#TimeUsernameProblemLanguageResultExecution timeMemory
1291994lmquanRace (IOI11_race)C++20
100 / 100
593 ms38248 KiB
#define taskname ""
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 200005;
const int kMaxK = 1000005;

int n, k, min_length = kMaxN, sz[kMaxN], a[kMaxK];
bool deleted[kMaxN];
vector<pair<int, int>> adj[kMaxN];

int DFS1(int u, int p) {
  sz[u] = 1;
  for (auto i : adj[u]) {
    int v = i.first;
    if (v == p || deleted[v]) {
      continue;
    }
    sz[u] += DFS1(v, u);
  }
  return sz[u];
}

int FindCentroid(int u, int p, int m) {
  for (auto i : adj[u]) {
    int v = i.first;
    if (v == p || deleted[v]) {
      continue;
    }
    if (sz[v] > m / 2) {
      return FindCentroid(v, u, m);
    }
  }
  return u;
}

void DFS2(int u, int p, int length, int total_weight, vector<pair<int, int>>& S) {
  if (total_weight > k) {
    return ;
  }
  S.push_back({length, total_weight});
  for (auto i : adj[u]) {
    int v = i.first, w = i.second;
    if (v == p || deleted[v]) {
      continue;
    }
    DFS2(v, u, length + 1, total_weight + w, S);
  }
}

void CentroidDecomposition(int u) {
  int x = DFS1(u, -1), y = FindCentroid(u, -1, x);
  deleted[y] = true;

  vector<int> U;

  for (auto i : adj[y]) {
    int z = i.first, t = i.second;
    if (deleted[z]) {
      continue;
    }
    vector<pair<int, int>> S;
    DFS2(z, y, 1, t, S);

    for (auto j : S) {
      if (a[k - j.second] == -1) {
        continue;
      }
      if (j.first + a[k - j.second] < min_length) {
        min_length = j.first + a[k - j.second];
      }
    }

    for (auto j : S) {
      if (j.second > 0) {
        U.push_back(j.second);
      }
      if (a[j.second] == -1 || a[j.second] > j.first) {
        a[j.second] = j.first;
      }
    }
  }

  for (int i : U) {
    a[i] = -1;
  }

  for (auto i : adj[y]) {
    int z = i.first;
    if (!deleted[z]) {
      CentroidDecomposition(z);
    }
  }
}

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

  int root = 0;
  CentroidDecomposition(root);

  return (min_length == kMaxN ? -1 : min_length);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...