Submission #427770

#TimeUsernameProblemLanguageResultExecution timeMemory
427770albertolg101Sky Walking (IOI19_walk)C++17
10 / 100
4086 ms527088 KiB
#include <bits/stdc++.h> #include "walk.h" using namespace std; using ll = long long; using pii = pair<int, int>; const ll INFLL = 1e18; 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 start, int end) { int n = x.size(), m = y.size(); vector<pii> cc; vector<vector<int>> skywalk(n); cc.push_back({start, 0}); cc.push_back({end, 0}); skywalk[start].push_back(0); skywalk[end].push_back(0); for(int i = 0 ; i < m ; i++) { for(int j = L[i] ; j <= R[i] ; j++) { if(h[j] >= y[i]) { cc.push_back({j, y[i]}); skywalk[j].push_back(y[i]); } } } sort(cc.begin(), cc.end()); cc.resize(unique(cc.begin(), cc.end()) - cc.begin()); vector<vector<pair<int, ll>>> g(cc.size()); for(int i = 0 ; i < n ; i++) { sort(skywalk[i].begin(), skywalk[i].end()); for(int j = 0 ; j + 1 < skywalk[i].size() ; j++) { int a = lower_bound(cc.begin(), cc.end(), (pii){i, skywalk[i][j]}) - cc.begin(), b = lower_bound(cc.begin(), cc.end(), (pii){i, skywalk[i][j+1]}) - cc.begin(); ll w = skywalk[i][j+1] - skywalk[i][j]; g[a].push_back({b, w}); g[b].push_back({a, w}); } } for(int i = 0 ; i < m ; i++) { int a = -1; for(int j = L[i] ; j <= R[i] ; j++) { if(h[j] >= y[i]) { if(a == -1) { a = lower_bound(cc.begin(), cc.end(), (pii){j, y[i]}) - cc.begin(); } else { int b = lower_bound(cc.begin(), cc.end(), (pii){j, y[i]}) - cc.begin(); ll w = x[cc[b].first] - x[cc[a].first]; g[a].push_back({b, w}); g[b].push_back({a, w}); a = b; } } } } priority_queue<pair<ll, int>> q; int s = lower_bound(cc.begin(), cc.end(), (pii){start, 0}) - cc.begin(); q.push({0, s}); vector<bool> flag(cc.size()); vector<ll> dp(cc.size(), INFLL); dp[s] = 0; while(q.size()) { int nod = q.top().second; q.pop(); if(flag[nod]) continue; flag[nod] = true; for(auto i: g[nod]) { if(dp[i.first] > dp[nod] + i.second) { dp[i.first] = dp[nod] + i.second; q.push({-dp[i.first], i.first}); } } } int e = lower_bound(cc.begin(), cc.end(), (pii){end, 0}) - cc.begin(); return (dp[e] == INFLL ? -1 : dp[e]); }

Compilation message (stderr)

walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:43:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |   for(int j = 0 ; j + 1 < skywalk[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...