제출 #761400

#제출 시각아이디문제언어결과실행 시간메모리
761400MinaRagy06Sky Walking (IOI19_walk)C++17
10 / 100
4085 ms259496 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #pragma GCC optimize("Ofast") vector<int> intersect[100'005]; vector<pair<int, int>> adj[100'005]; vector<ll> dist[100'005]; vector<int> idx[100'005]; int sparse[17][200'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) { int n = x.size(), m = l.size(); for (int i = 0; i < n; i++) { sparse[0][i] = h[i]; } for (int j = 1; j < 17; j++) { for (int i = 0; i < n; i++) { sparse[j][i] = max(sparse[j - 1][i], sparse[j - 1][i + (1 << (j - 1))]); } } y.push_back(0); idx[s].push_back(m); dist[s].push_back(INF); for (int i = 0; i < m; i++) { int j = l[i]; while (j <= r[i]) { if (y[i] <= h[j]) { intersect[i].push_back(j); j++; continue; } int mx = 0; for (int k = 16; k >= 0; k--) { if (y[i] > max(mx, sparse[k][j])) { mx = max(mx, sparse[k][j]); j += (1 << k); } } if (j <= r[i]) { intersect[i].push_back(j); j++; } } 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}); } } // assert(intersect[i].size() <= 10); } 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}}); } } } ll ans = INF; for (int i = 0; i < dist[g].size(); i++) { ans = min(ans, dist[g][i] + y[idx[g][i]]); } // for (auto i : dist[g]) { // ans = min(ans, i.first + i.second); // } if (ans >= INF) return -1; return ans; }

컴파일 시 표준 에러 (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:45:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |         for (int k = 0; k < intersect[i].size(); k++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:49:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |         for (int k = 0; k < intersect[i].size(); k++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:50:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |             if (k + 1 < intersect[i].size()) {
      |                 ~~~~~~^~~~~~~~~~~~~~~~~~~~~
walk.cpp:77:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |     for (int i = 0; i < dist[g].size(); 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...