제출 #1025973

#제출 시각아이디문제언어결과실행 시간메모리
1025973model_codeText editor (CEOI24_editor)C++17
14 / 100
424 ms1048576 KiB
// Author: Tymofii Reizin
#include <iostream>
#include <vector>
#include <queue>
#include <array>

using namespace std;

int main()
{
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    int sl, sc, el, ec;
    cin >> sl >> sc >> el >> ec;
    --sl;
    --sc;
    --el;
    --ec;
    vector<int> l(n);
    for (int &i : l)
        cin >> i;
    vector<vector<int>> dist(n);
    vector<vector<bool>> used(n);
    for (int i = 0; i < n; ++i)
    {
        dist[i].resize(l[i] + 1, (int)2e9 + 5);
        used[i].resize(l[i] + 1);
    }
    array<int, 4> dx{1, -1, 0, 0};
    array<int, 4> dy{0, 0, 1, -1};
    array<char, 4> move{'u', 'd', 'r', 'l'};
    auto check = [&l, n](int &x, int &y, char move) -> bool
    {
        if (x < 0 || x >= n)
            return false;

        if (y == -1 && move == 'l')
        {
            --x;
            if (x < 0)
                return false;
            y = l[x];
        }
        else if (y == l[x] + 1 && move == 'r')
        {
            ++x;
            if (x >= n)
                return false;
            y = 0;
        }
        else
            y = min(y, l[x]);
        return true;
    };
    queue<pair<int, int>> q;
    q.push({sl, sc});
    dist[sl][sc] = 0;
    while (!q.empty())
    {
        auto [x, y] = q.front();
        q.pop();
        if (used[x][y])
            continue;
        used[x][y] = true;
        for (int i = 0; i < 4; ++i)
        {
            int nx = x + dx[i], ny = y + dy[i];
            if (check(nx, ny, move[i]))
            {
                dist[nx][ny] = min(dist[nx][ny], dist[x][y] + 1);
                q.push({nx, ny});
            }
        }
        if (dist[el][ec] != (int)2e9 + 5)
            break;
    }
    cout << dist[el][ec] << '\n';
    return 0;
}




#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...