Submission #390984

#TimeUsernameProblemLanguageResultExecution timeMemory
390984SuhaibSawalha1Sky Walking (IOI19_walk)C++17
10 / 100
4111 ms511268 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; int dist (array<int, 2> &a, array<int, 2> &b) { return abs(a[0] - b[0]) + abs(a[1] - b[1]); } long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int src, int snk) { vector<array<int, 2>> p; int n = x.size(), m = y.size(); vector<vector<int>> adj; vector<int> seg[n + m], S[n], E[n]; auto add = [&] (int i) { adj.push_back({i}); seg[i].push_back(p.size()); }; auto add2 = [&] (int i, int j) { adj.push_back({i, j}); seg[i].push_back(p.size()); seg[j].push_back(p.size()); }; for (int i = 0; i < n; ++i) { add(i); p.push_back({x[i], 0}); add(i); p.push_back({x[i], h[i]}); } for (int i = 0; i < m; ++i) { add2(l[i], n + i); p.push_back({x[l[i]], y[i]}); add2(r[i], n + i); p.push_back({x[r[i]], y[i]}); S[l[i]].push_back(i); E[r[i]].push_back(i); } set<array<int, 2>> s; for (int i = 0; i < n; ++i) { for (int v : S[i]) { s.insert({y[v], v}); } for (auto &v : s) { if (v[0] > h[i]) { break; } add2(i, n + v[1]); p.push_back({x[i], v[0]}); } for (int v : E[i]) { s.erase({y[v], v}); } } priority_queue<pair<long long, int>> pq; pq.push({0, 2 * src}); vector<long long> dis(adj.size(), 1e18); dis[2 * src] = 0; while (pq.size()) { long long d = -pq.top().first; int u = pq.top().second; pq.pop(); if (d != dis[u]) { continue; } for (int e : adj[u]) { auto l = lower_bound(seg[e].begin(), seg[e].end(), u); rotate(l, l + 1, seg[e].end()); seg[e].pop_back(); for (int v : seg[e]) { int dd = dist(p[u], p[v]); if (d + dd < dis[v]) { dis[v] = d + dd; pq.push({-dis[v], v}); } } } } return dis[2 * snk] == 1e18 ? -1 : dis[2 * snk]; }
#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...