Submission #933544

#TimeUsernameProblemLanguageResultExecution timeMemory
933544MaaxleRace (IOI11_race)C++17
100 / 100
390 ms104020 KiB
#include "race.h"
#include <bits/stdc++.h>

#define range(it, a, b) for (ll it = a; it < b; it++)
#define all(x) begin(x), end(x)
#define ll long long
#define ull unsigned long long
#define INF64 ((ll) 1 << 60)
#define INF32 (1 << 30)
#define mset multiset
#define uset unordered_set
#define umap unordered_map 
#define pqueue priority_queue
#define ptr(A) shared_ptr<A>

using namespace std;

struct Path {
  ll i, w;
};

ll n, k;
vector<vector<Path>> adj;
vector<map<ll, ll>> paths;
ll ans = INF64;

void debug (ll i) {
  cout << "NODE: " << i << '\n';
  for (auto child_path : paths[i]) 
    cout << child_path.first << " : " << child_path.second << '\n';
}

void explore(ll i, ll from, ll cnt, ll roads) {
  paths[i][cnt] = roads;

  for (Path child : adj[i]) {
    if (child.i == from)
      continue;

    explore(child.i, i, cnt + child.w, roads + 1);

    if (paths[i].size() < paths[child.i].size())
      swap(paths[child.i], paths[i]);

    for (auto child_path : paths[child.i]) {
      ll sum = k + 2*cnt;

      if (paths[i].count(sum - child_path.first))
        ans = min(ans, paths[i][sum - child_path.first] + child_path.second - 2*roads);
    }

    for (auto child_path : paths[child.i]) {
      if (paths[i].count(child_path.first))
        paths[i][child_path.first] = min(paths[i][child_path.first], child_path.second);
      else 
        paths[i][child_path.first] = child_path.second;
    }
  }

  // debug(i);
}

int best_path(int N, int K, int H[][2], int L[]) {
  n = N; k = K;
  adj.resize(n);
  paths.resize(n);

  range(i, 0, n) {
    adj[H[i][0]].push_back({H[i][1], L[i]});
    adj[H[i][1]].push_back({H[i][0], L[i]});
  }

  explore(0, 0, 0, 0);
  return (ans == INF64 ? -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...