Submission #155081

#TimeUsernameProblemLanguageResultExecution timeMemory
155081wakakaSky Walking (IOI19_walk)C++14
33 / 100
2064 ms82204 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; //#define cerr if (false) cerr #define db(x) cerr << #x << "=" << x << endl #define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl #define db3(x, y, z) cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z << endl #define dbv(v) cerr << #v << "="; for (auto _x : v) cerr << _x << ", "; cerr << endl #define dba(a, n) cerr << #a << "="; for (int _i = 0; _i < (n); ++_i) cerr << a[_i] << ", "; cerr << endl template <typename A, typename B> ostream& operator<<(ostream& os, const pair<A, B>& x) { return os << "(" << x.first << "," << x.second << ")"; } typedef long long ll; typedef long double ld; 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 = l.size(); vector<vector<int>> vert(n), hor(m); vector<vector<pair<int, int>>> events(n); for (int i = 0; i < m; ++i) { events[l[i]].emplace_back(i, 1); events[r[i]].emplace_back(i, -1); } auto cmp = [&](int a, int b) { if (y[a] != y[b]) return y[a] < y[b]; return a < b; }; set<int, decltype(cmp)> S(cmp); for (int i = 0; i < n; ++i) { for (auto& e : events[i]) { int j = e.first; vert[i].push_back(y[j]); hor[j].push_back(x[i]); if (e.second == 1) S.insert(j); } for (auto& e : events[i]) { int j = e.first; auto it = S.lower_bound(j); if (it == S.begin()) continue; int k = *prev(it); hor[k].push_back(x[i]); vert[i].push_back(y[k]); } if (i == s || i == g) vert[i].push_back(0); for (auto& e : events[i]) { int j = e.first; if (e.second == -1) S.erase(j); } } map<pair<int, int>, int> mp; auto getId = [&](pair<int, int> a) { auto it = mp.find(a); if (it != mp.end()) return it->second; int s = mp.size(); return mp[a] = s; }; for (int i = 0; i < n; ++i) for (int j : vert[i]) getId({x[i], j}); for (int i = 0; i < m; ++i) for (int j : hor[i]) getId({j, y[i]}); vector<vector<pair<int, int>>> E(mp.size()); for (int i = 0; i < n; ++i) { sort(vert[i].begin(), vert[i].end()); vert[i].resize(unique(vert[i].begin(), vert[i].end()) - vert[i].begin()); for (int j = 0; j + 1 < vert[i].size(); ++j) { int u = getId({x[i], vert[i][j]}); int v = getId({x[i], vert[i][j + 1]}); int d = vert[i][j + 1] - vert[i][j]; E[u].push_back({v, d}); E[v].push_back({u, d}); } } for (int i = 0; i < m; ++i) { sort(hor[i].begin(), hor[i].end()); hor[i].resize(unique(hor[i].begin(), hor[i].end()) - hor[i].begin()); for (int j = 0; j + 1 < hor[i].size(); ++j) { int u = getId({hor[i][j], y[i]}); int v = getId({hor[i][j + 1], y[i]}); int d = hor[i][j + 1] - hor[i][j]; E[u].push_back({v, d}); E[v].push_back({u, d}); } } const ll INF = 1LL << 60; vector<ll> dist(mp.size(), INF); int src = getId({x[s], 0}), dest = getId({x[g], 0}); typedef pair<ll, int> Pair; priority_queue<Pair, vector<Pair>, greater<Pair>> pq; dist[src] = 0; pq.emplace(dist[src], src); while (!pq.empty()) { int u = pq.top().second; ll cdist = pq.top().first; pq.pop(); if (cdist > dist[u]) continue; for (auto e : E[u]) { int v = e.first; ll val = dist[u] + e.second; if (val < dist[v]) { dist[v] = val; pq.emplace(val, v); } } } return dist[dest] == INF ? -1 : dist[dest]; }

Compilation message (stderr)

walk.cpp: In function 'll min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:66:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < vert[i].size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~~~~~
walk.cpp:77:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < hor[i].size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~~~~
#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...