Submission #831156

#TimeUsernameProblemLanguageResultExecution timeMemory
831156PurpleCrayonSky Walking (IOI19_walk)C++17
10 / 100
30 ms17000 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; #define sz(v) int(v.size()) #define ar array typedef long long ll; const int N = 2e5+10; const ll INF = 1e18+10; template <class T> using min_pq = priority_queue<T, vector<T>, greater<T>>; int n, m; vector<pair<int, int>> adj[N]; ll dist[N]; void add_edge(int a, int b, int w) { assert(w >= 0); adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); } void dijkstra(int S) { fill(dist, dist + N, INF); min_pq<pair<ll, int>> pq; pq.push({dist[S] = 0, S}); while (!pq.empty()) { auto [d_c, c] = pq.top(); pq.pop(); if (dist[c] != d_c) continue; for (auto [nxt, w] : adj[c]) { if (dist[nxt] > dist[c] + w) { dist[nxt] = dist[c] + w; pq.push({dist[nxt], nxt}); } } } } long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g) { n = sz(x), m = sz(l); for (int i = 0; i < m; i++) { for (int j = l[i]; j <= r[i]; j++) { // i * n + j if (j > l[i]) { add_edge(i * n + j - 1, i * n + j, x[j] - x[j-1]); } } } for (int j = 0; j < n; j++) { vector<int> open; for (int i = 0; i < m; i++) if (l[i] <= j && j <= r[i] && y[i] <= h[j]) { open.push_back(i); } sort(open.begin(), open.end(), [&](int a, int b) { return y[a] < y[b]; }); int p = -1; for (int i : open) { if (p != -1) { add_edge(i * n + j, p * n + j, y[i] - y[p]); } p = i; } } int S = n * m; for (int i = 0; i < m; i++) { if (l[i] <= s && s <= r[i] && y[i] <= h[s]) { add_edge(S, i * n + s, y[i]); } } dijkstra(S); ll ans = INF; for (int i = 0; i < m; i++) { if (l[i] <= g && g <= r[i] && y[i] <= h[g]) { ans = min(ans, dist[i * n + g] + y[i]); } } return (ans == INF ? -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...
#Verdict Execution timeMemoryGrader output
Fetching results...