Submission #1196271

#TimeUsernameProblemLanguageResultExecution timeMemory
1196271mmaitiText editor (CEOI24_editor)C++20
45 / 100
4102 ms290632 KiB
#include <bits/stdc++.h> #include <queue> #include <tuple> using namespace std; typedef long long ll; #define vi vector<int> #define si set<int> #define usi unordered_set<int> #define sll set<ll> #define usll unordered_set<ll> #define vb vector<bool> #define vll vector<ll> #define pii pair<int, int> #define pll pair<ll, ll> #define vvi vector<vector<int>> #define vvll vector<vector<ll>> #define lll tuple<ll, ll, ll> /*const ll INF = 1e13;*/ ll N; pll s, f; vll L(N); ll DK() { map<pll, ll> m; m[{s.first, s.second}] = 0; priority_queue<lll, vector<lll>, greater<lll>> pq; pq.push(make_tuple(0, s.first, s.second)); while (!pq.empty()) { auto [c, x, y] = pq.top(); pq.pop(); if (m.find({x, y}) != m.end() && m[{x, y}] < c) continue; if (x == f.first && y == f.second) { break; } vector<lll> moves; // left special if (y == 0 && x - 1 >= 0) { moves.push_back(make_tuple(1, x - 1, L[x - 1])); } // right special if (y == L[x] && x + 1 < N) { moves.push_back(make_tuple(1, x + 1, 0)); } // move along the same line sll tp = {0, s.second, f.second, L[x]}; for (int i : tp) { moves.push_back(make_tuple(abs(y - i), x, i)); } // move up or down for (int dx : {-1, 1}) { if (x + dx >= 0 && x + dx < N) { sll chk = {0, s.second, f.second, L[x + dx]}; if (y > L[x + dx]) { moves.push_back(make_tuple(1, x + dx, L[x + dx])); } /*else if (chk.find(y) == chk.end()) {*/ /* for (int i : chk) {*/ /* moves.push_back(make_tuple(1 + abs(y - i), x + dx, i));*/ /* }*/ /*} */ else { moves.push_back(make_tuple(1, x + dx, y)); } } } for (auto i : moves) { int ct, nx, ny; tie(ct, nx, ny) = i; if (m.find({nx, ny}) == m.end() || m[{x, y}] + ct < m[{nx, ny}]) { m[{nx, ny}] = m[{x, y}] + ct; pq.push(make_tuple(m[{nx, ny}], nx, ny)); } } } return m[{f.first, f.second}]; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cin >> N; L.resize(N); cin >> s.first >> s.second >> f.first >> f.second; --s.first; --s.second; --f.first; --f.second; for (int i = 0; i < N; i++) { cin >> L[i]; } cout << DK() << "\n"; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...