Submission #774895

#TimeUsernameProblemLanguageResultExecution timeMemory
774895t6twotwoSky Walking (IOI19_walk)C++17
24 / 100
4086 ms639420 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; using ll = long long; ll min_distance(vector<int> X, vector<int> H, vector<int> L, vector<int> R, vector<int> Y, int s, int g) { int N = X.size(); int M = Y.size(); map<pair<int, int>, int> mp; vector<pair<int, int>> p; for (int i = 0; i < N; i++) { mp[{X[i], 0}] = i; p.emplace_back(X[i], 0); } vector<vector<pair<int, int>>> adj(N); vector<tuple<int, int, int>> T(N + M); for (int i = 0; i < N; i++) { T[i] = {H[i], 1, i}; } for (int i = 0; i < M; i++) { T[N + i] = {Y[i], 0, i}; } sort(T.rbegin(), T.rend()); set<int> S; int q; for (auto [y, t, k] : T) { if (t == 1) { S.insert(k); } else { q = -1; auto it = S.lower_bound(L[k]); while (it != S.end() && (*it) <= R[k]) { int z = *it, w; it++; if (!mp.count({X[z], y})) { mp[{X[z], y}] = w = p.size(); p.emplace_back(X[z], y); adj.push_back({}); } else { w = mp[{X[z], y}]; } if (q != -1) { adj[q].emplace_back(w, X[z] - p[q].first); adj[w].emplace_back(q, X[z] - p[q].first); } q = w; } } } q = -1; for (auto [P, k] : mp) { auto [x, y] = P; if (q != -1 && p[q].first == x) { adj[k].emplace_back(q, y - p[q].second); adj[q].emplace_back(k, y - p[q].second); } q = k; } int K = adj.size(); vector<ll> dis(K, -1); priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.emplace(0, s); while (!pq.empty()) { auto [d, x] = pq.top(); pq.pop(); if (dis[x] != -1) { continue; } dis[x] = d; for (auto [y, z] : adj[x]) { pq.emplace(d + z, y); } } return dis[g]; }
#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...