Submission #761407

#TimeUsernameProblemLanguageResultExecution timeMemory
761407MinaRagy06Sky Walking (IOI19_walk)C++17
10 / 100
4066 ms260332 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> intersect[100'005]; vector<pair<int, int>> adj[100'005]; vector<ll> dist[100'005]; vector<int> idx[100'005]; const ll INF = 1e18; ll min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g) { auto st = chrono::steady_clock::now().time_since_epoch().count(); int n = x.size(), m = l.size(); array<int, 3> skywalks[m]; for (int i = 0; i < m; i++) { skywalks[i] = {y[i], l[i], r[i]}; } sort(skywalks, skywalks + m); for (int i = m - 1; i >= 0; i--) { y[m - 1 - i] = skywalks[i][0]; l[m - 1 - i] = skywalks[i][1]; r[m - 1 - i] = skywalks[i][2]; } array<int, 3> buildings[n]; for (int i = 0; i < n; i++) { buildings[i] = {h[i], x[i], i}; } int actual[n]; sort(buildings, buildings + n); bool oks = 0, okg = 0; for (int i = 0; i < n; i++) { h[i] = buildings[i][0]; x[i] = buildings[i][1]; actual[i] = buildings[i][2]; if (!oks && s == actual[i]) { s = i; oks = 1; } if (!okg && g == actual[i]) { g = i; okg = 1; } } y.push_back(0); idx[s].push_back(m); dist[s].push_back(INF); int ptr = n - 1; set<array<int, 3>> gud; for (int i = 0; i < m; i++) { while (ptr >= 0 && y[i] <= h[ptr]) { gud.insert({actual[ptr], ptr, h[ptr]}); ptr--; } auto it = gud.lower_bound({l[i], 0, 0}); while (it != gud.end() && (*it)[0] <= r[i]) { intersect[i].push_back((*it)[1]); it++; } for (int k = 0; k < intersect[i].size(); k++) { dist[intersect[i][k]].push_back(INF); idx[intersect[i][k]].push_back(i); } for (int k = 0; k < intersect[i].size(); k++) { if (k + 1 < intersect[i].size()) { adj[intersect[i][k]].push_back({intersect[i][k + 1], idx[intersect[i][k + 1]].size() - 1}); } if (k - 1 >= 0) { adj[intersect[i][k]].push_back({intersect[i][k - 1], idx[intersect[i][k - 1]].size() - 1}); } } } priority_queue<pair<ll, pair<int, int>>> pq; pq.push({0, {s, 0}}); while (pq.size()) { ll d = -pq.top().first; int i = pq.top().second.first; int j = pq.top().second.second; pq.pop(); if (d > dist[i][j]) continue; j = y[idx[i][j]]; for (auto [nxt, nxth] : adj[i]) { ll newd = d + abs(x[nxt] - x[i]) + abs(j - y[idx[nxt][nxth]]); if (newd < dist[nxt][nxth]) { dist[nxt][nxth] = newd; pq.push({-newd, {nxt, nxth}}); } } } // cout << s << ' ' << g << '\n'; ll ans = INF; for (int i = 0; i < dist[g].size(); i++) { ans = min(ans, dist[g][i] + y[idx[g][i]]); } // auto en = chrono::steady_clock::now().time_since_epoch().count(); // cout << (en - st) / 1e9 << '\n'; if (ans >= INF) return -1; return ans; } //int main() { // ios_base::sync_with_stdio(0), cin.tie(0); // int N, M; // cin >> N >> M; // vector<int> X(N), H(N); // for (int i = 0; i < N; i++) { // cin >> X[i] >> H[i]; // } // vector<int> L(M), R(M), Y(M); // for (int i = 0; i < M; i++) { // cin >> L[i] >> R[i] >> Y[i]; // } // int S, G; // cin >> S >> G; // cout << min_distance(X, H, L, R, Y, S, G) << '\n'; // return 0; //}

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:58:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |         for (int k = 0; k < intersect[i].size(); k++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:62:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |         for (int k = 0; k < intersect[i].size(); k++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:63:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |             if (k + 1 < intersect[i].size()) {
      |                 ~~~~~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:90:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |     for (int i = 0; i < dist[g].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
walk.cpp:11:10: warning: unused variable 'st' [-Wunused-variable]
   11 |     auto st = chrono::steady_clock::now().time_since_epoch().count();
      |          ^~
#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...