제출 #1242686

#제출 시각아이디문제언어결과실행 시간메모리
1242686BoasSky Walking (IOI19_walk)C++20
0 / 100
2830 ms1114112 KiB
#include "walk.h" // #pragma GCC optimize("trapv") #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define sz(x) (int)(x).size() typedef int32_t i32; // typedef pair<int, int> ii; typedef tuple<int, i32, i32> iii; // typedef vector<int> vi; typedef vector<int32_t> vi32; // typedef vector<ii> vii; // typedef vector<vi> vvi; // typedef vector<vii> vvii; // typedef set<ii> sii; typedef unordered_map<i32, int> mii; #define loop(n, i) for (i32 i = 0; i < n; i++) int INF = 1e18; int min_distance(vi32 x, vi32 h, vi32 l, vi32 r, vi32 y, i32 s, i32 g) { i32 n = sz(x), m = sz(l); vector<unordered_map<i32, vi32>> adj(n); loop(m, i) { for (i32 p = l[i]; p <= r[i]; p++) { if (h[p] < y[i]) continue; for (i32 p2 = l[i]; p2 <= r[i]; p2++) { if (h[p2] < y[i]) continue; if (p == p2) continue; adj[p][i].pb(p2); } } } priority_queue<iii, vector<iii>, greater<iii>> q; vector<mii> disList(n); auto dis = [&](i32 p, i32 y) -> int { if (disList[p].count(y)) return disList[p][y]; return INF; }; q.push({0, s, 0}); while (!q.empty()) { auto [d, p, yix] = q.top(); q.pop(); if (dis(p, yix) < d) continue; disList[p][yix] = d; for (i32 p2 : adj[p][yix]) { int d2 = d + abs(x[p2] - x[p]); if (d2 < dis(p2, yix)) { disList[p2][yix] = d2; q.push({d2, p2, yix}); } } for (auto [y2, _] : adj[p]) { int d2 = d + abs(y[y2] - y[yix]); if (d2 < dis(p, y2)) { disList[p][y2] = d2; q.push({d2, p, y2}); } } } int res = INF; for (auto [yix, _] : adj[g]) { res = min(res, dis(g, yix) + y[yix]); } if (res == INF) return -1; return res; }
#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...