제출 #418131

#제출 시각아이디문제언어결과실행 시간메모리
418131usachevd0Sky Walking (IOI19_walk)C++17
15 / 100
184 ms21596 KiB
#include <bits/stdc++.h> #ifndef LOCAL #include "walk.h" #endif using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define all(a) (a).begin(), (a).end() #define Time (clock() * 1.0 / CLOCKS_PER_SEC) using ll = long long; using ull = unsigned long long; using pii = pair<int, int>; using pil = pair<int, ll>; using pli = pair<ll, int>; using pll = pair<ll, ll>; using ld = long double; template<typename T1, typename T2> bool chkmin(T1& x, T2 y) { return y < x ? (x = y, true) : false; } template<typename T1, typename T2> bool chkmax(T1& x, T2 y) { return y > x ? (x = y, true) : false; } void debug_out() { cerr << endl; } template<typename T1, typename... T2> void debug_out(T1 A, T2... B) { cerr << ' ' << A; debug_out(B...); } template<typename T> void mdebug_out(T* a, int n) { for (int i = 0; i < n; ++i) cerr << a[i] << ' '; cerr << endl; } #ifdef LOCAL #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #define mdebug(a, n) cerr << #a << ": ", mdebug_out(a, n) #else #define debug(...) 1337 #define mdebug(a, n) 1337 #endif template<typename T> ostream& operator << (ostream& stream, const vector<T>& v) { for (auto& x : v) stream << x << ' '; return stream; } template<typename T1, typename T2> ostream& operator << (ostream& stream, const pair<T1, T2>& p) { return stream << p.first << ' ' << p.second; } const ll INF64 = 1e18; const int maxN = 100005; int n, m; vector<int> bg[maxN], en[maxN]; ll min_distance(vector<int> X, vector<int> H, vector<int> L, vector<int> R, vector<int> Y, int SI, int TI) { n = X.size(), m = L.size(); assert(SI == 0 && TI == n - 1); for (int j = 0; j < m; ++j) { int l = L[j], r = R[j]; bg[l].push_back(j); en[r].push_back(j); } multiset<pil> a; for (int j : bg[0]) { int y = Y[j]; a.insert({y, y}); } for (int i = 1; i < n; ++i) { if (a.empty()) return -1; for (int j : bg[i]) { int y = Y[j]; ll v = INF64; auto it = a.lower_bound({y, -1}); if (it != a.end() && it->fi <= H[i]) chkmin(v, it->fi - y + it->se); if (it != a.begin()) { it = prev(it); chkmin(v, y - it->fi + it->se); } a.insert({y, v}); } if (i == n - 1) break; for (int j : en[i]) { int y = Y[j]; a.erase(a.lower_bound({y, -1})); } } ll ans = INF64; for (auto& [y, v] : a) { chkmin(ans, X[n - 1] - X[0] + y + v); } return ans; } #ifdef LOCAL int32_t main() { #ifdef LOCAL freopen("in", "r", stdin); #endif ios::sync_with_stdio(0); cin.tie(0); int n, m; assert(2 == scanf("%d%d", &n, &m)); vector<int> x(n), h(n); for (int i = 0; i < n; i++) assert(2 == scanf("%d%d", &x[i], &h[i])); vector<int> l(m), r(m), y(m); for (int i = 0; i < m; i++) assert(3 == scanf("%d%d%d", &l[i], &r[i], &y[i])); int s, g; assert(2 == scanf("%d%d", &s, &g)); fclose(stdin); long long result = min_distance(x, h, l, r, y, s, g); printf("%lld\n", result); fclose(stdout); return 0; } #endif
#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...