제출 #906303

#제출 시각아이디문제언어결과실행 시간메모리
906303vjudge1Sky Walking (IOI19_walk)C++17
0 / 100
4154 ms1048576 KiB
#include "walk.h" #pragma GCC target ("avx2") #pragma GCC optimize ("O3") #pragma GCC optimize ("unroll-loops") #include<bits/stdc++.h> #include<math.h> using namespace std; typedef long long int ll; typedef long double ld; typedef pair<ll, ll> pl; typedef vector<ll> vl; #define FD(i, r, l) for(ll i = r; i > (l); --i) #define K first #define V second #define G(x) ll x; cin >> x; #define GD(x) ld x; cin >> x; #define GS(s) string s; cin >> s; #define EX(x) { cout << x << '\n'; exit(0); } #define A(a) (a).begin(), (a).end() #define F(i, l, r) for (ll i = l; i < (r); ++i) struct info { ll l, r; ll height; info(ll l, ll r, ll height): l(l), r(r), height(height) {} } ; 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 s, int g) { ll n = x.size(); // the only important heights, anyways vector<ll> yvalues(A(y)); yvalues.push_back(0); sort(A(yvalues)); yvalues.erase(unique(A(yvalues)), yvalues.end()); ll m = yvalues.size(); vector<vl> dist(n, vl(m, 1e18)); priority_queue<pair<ll, pl>, vector<pair<ll, pl>>, greater<>> pq; map<ll, vector<info>> skywalks; F(i, 0, y.size()) skywalks[y[i]].emplace_back(l[i], r[i], y[i]); dist[s][0] = 0; pq.emplace(0, pair(s, 0)); while (pq.size()) { auto [d, head] = pq.top(); pq.pop(); auto [i, j] = head; if (d != dist[i][j]) continue; assert(yvalues[j] <= h[i]); vector<pair<ll, pl>> edges; // going up and down auto place = [&](ll nj) { if (!(0 <= nj and nj < m)) return; if (yvalues[nj] <= h[i]) { edges.emplace_back(abs(yvalues[j] - yvalues[nj]), pair(i, nj)); } }; place(j-1); place(j+1); if (j) for (auto &[l, r, height]: skywalks[yvalues[j]]) { auto canreach = [&](ll i, ll j) { return height <= h[i] and l <= i and i <= r; }; if (canreach(i, j)) { F(ni, l, r+1) if (canreach(ni, j)) { edges.emplace_back(abs(x[i] - x[ni]), pair(ni, j)); } // // we can go between this to other nodes // FD(ni, i-1, -1) if (canreach(ni, j)) { // edges.emplace_back(abs(x[i] - x[ni]), pair(ni, j)); // break; // } // F(ni, i+1, n) if (canreach(ni, j)) { // edges.emplace_back(abs(x[i] - x[ni]), pair(ni, j)); // break; // } } } for (const auto &[w, to]: edges) { auto [nr, nc] = to; if (d + w < dist[nr][nc]) { dist[nr][nc] = d + w; pq.emplace(d + w, to); } } } return dist[g][0]; }

컴파일 시 표준 에러 (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:23:37: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 | #define F(i, l, r) for (ll i = l; i < (r); ++i)
      |                                     ^
walk.cpp:44:5: note: in expansion of macro 'F'
   44 |     F(i, 0, y.size()) skywalks[y[i]].emplace_back(l[i], r[i], y[i]);
      |     ^
#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...