Submission #429179

#TimeUsernameProblemLanguageResultExecution timeMemory
429179albertolg101Sky Walking (IOI19_walk)C++17
24 / 100
4057 ms313036 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<vector<int>> rmq(h.size(), vector<int> (18)); for(int i = 0 ; i < h.size() ; i++) rmq[i][0] = h[i]; for(int i = 1 ; (1<<i) < n ; i++) { for(int j = 0 ; j + (1<<i) - 1 < n ; j++) { rmq[j][i] = max(rmq[j][i-1], rmq[j+(1<<(i-1))][i-1]); } }; function<int(int, int)> query = [&](int l, int r) { int lg = __lg(r - l + 1); return max(rmq[l][lg], rmq[r-(1<<lg)+1][lg]); }; vector<pii> cc; vector<vector<int>> d(n); d[start].push_back(0); d[end].push_back(0); cc.push_back({x[start], 0}); cc.push_back({x[end], 0}); for(int i = 0 ; i < m ; i++) { int L = l[i]; cc.push_back({x[l[i]], y[i]}); d[l[i]].push_back(y[i]); while(l[i] < r[i]) { for(int j = 18 ; j >= 0 ; j--) { int target = l[i] + (1<<j); if(target <= r[i] and query(l[i]+1, target) < y[i]) l[i] = target; } l[i]++; cc.push_back({x[l[i]], y[i]}); d[l[i]].push_back(y[i]); } l[i] = L; } sort(cc.begin(), cc.end()); cc.resize(unique(cc.begin(), cc.end()) - cc.begin()); function<int(int, int)> f = [&](int a, int b) { return lower_bound(cc.begin(), cc.end(), (pii){a, b}) - cc.begin(); }; vector<vector<pair<int, ll>>> g(cc.size()); for(int i = 0 ; i < m ; i++) { int last = l[i]; while(l[i] < r[i]) { for(int j = 18 ; j >= 0 ; j--) { int target = l[i] + (1<<j); if(target <= r[i] and query(l[i]+1, target) < y[i]) l[i] = target; } l[i]++; int a = f(x[last], y[i]), b = f(x[l[i]], y[i]), w = x[l[i]] - x[last]; g[a].push_back({b, w}); g[b].push_back({a, w}); last = l[i]; } } for(int i = 0 ; i < n ; i++) { sort(d[i].begin(), d[i].end()); for(int j = 0 ; j + 1 < d[i].size() ; j++) { int a = f(x[i], d[i][j]), b = f(x[i], d[i][j+1]), w = d[i][j+1] - d[i][j]; g[a].push_back({b, w}); g[b].push_back({a, w}); } } priority_queue<pair<ll, int>> q; vector<ll> dp(cc.size(), INFLL); vector<bool> flag(cc.size()); int s = f(x[start], 0); dp[s] = 0; q.push({0, s}); 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 = f(x[end], 0); 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:17:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |  for(int i = 0 ; i < h.size() ; i++)
      |                  ~~^~~~~~~~~~
walk.cpp:104:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |   for(int j = 0 ; j + 1 < d[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...