Submission #1246883

#TimeUsernameProblemLanguageResultExecution timeMemory
1246883rtriSky Walking (IOI19_walk)C++20
10 / 100
4091 ms16840 KiB
#include "walk.h"
#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

int n;
vector<vector<int>> adj;

ll min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r,
                vector<int> y, int s, int g) {

  map<int, vector<int>> bridge_by_y;
  for (int i = 0; i < y.size(); i++) {
    if (!bridge_by_y.count(y[i]))
      bridge_by_y[y[i]] = vector<int>();
    bridge_by_y[y[i]].push_back(i);
  }

  priority_queue<tuple<ll, ll, ll>> que;
  que.push({0, s, 0});
  map<pair<ll, ll>, ll> dists;
  while (que.size()) {
    auto [dist, building, height] = que.top();
    que.pop();
    dist *= -1;
    if (dists.count({building, height}) && dists[{building, height}] < dist)
      continue;

    for (int i = 0; i < l.size(); i++)
      if (l[i] <= building && building <= r[i] && y[i] <= h[building]) {
        ll new_dist = dist + abs(height - y[i]);
        if (!dists.count({building, y[i]}) ||
            new_dist < dists[{building, y[i]}]) {
          dists[{building, y[i]}] = new_dist;
          que.push({-new_dist, building, y[i]});
        }
      }

    if (!bridge_by_y.count(height))
      continue;

    for (int bridge : bridge_by_y[height]) {
      if (!(l[bridge] <= building && building <= r[bridge]))
        continue;
      for (int build = l[bridge]; build <= r[bridge]; build++) {
        if (y[bridge] > h[build])
          continue;

        ll new_dist = dist + abs(x[build] - x[building]);
        if (!dists.count({build, height}) ||
            new_dist < dists[{build, height}]) {
          dists[{build, height}] = new_dist;
          que.push({-new_dist, build, height});
        }
      }
    }
  }

  ll ans = -1;
  for (auto [key, dist] : dists) {
    auto [building, height] = key;
    if (building == g)
      if (ans == -1 || dist + height < ans)
        ans = dist + height;
  }

  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...
#Verdict Execution timeMemoryGrader output
Fetching results...