제출 #1025974

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

using namespace std;

using ll = long long;

ll calcNo1(vector<ll>& l, int sl, int sc, int el, int ec)
{
    ll minMid = sc;
    for (int i = min(sl, el); i <= max(sl, el); ++i)
        minMid = min(minMid, l[i]);
    ll minim = minMid;
    ll res = 1e18;
    if (sc <= minMid)
        res = abs(ec - sc) + abs(sl - el);
    for (int i = sl - 1; i >= 0; --i)
    {
        minim = min(minim, minMid);
        if (l[i] > minim)
            continue;
        res = min(res, abs(ec - l[i]) + abs(i - sl) + abs(i - el));
    }
    minim = minMid;
    for (int i = sl + 1; i < (int)l.size(); ++i)
    {
        minim = min(minim, minMid);
        if (l[i] > minim)
            continue;
        res = min(res, abs(ec - l[i]) + abs(i - sl) + abs(i - el));
    }
    return res;
}

ll calcYes1(vector<ll>& l, int sl, int sc, int el, int ec)
{
    //find for each row start min dist from start
    vector<ll> d1(l.size(), 1e18);
    ll minim = sc;
    d1[sl] = sc;
    for (int i = sl; i >= 0; --i)
    {
        minim = min(minim, l[i]);
        if (minim == sc)
            d1[i + 1] = min(d1[i + 1], abs(l[i] - sc) + 1 + abs(i - sl));
        if (l[i] > minim)
            continue;
        d1[i] = min(d1[i], abs(i - sl) + l[i]);
        d1[i + 1] = min(d1[i + 1], 1ll + abs(i - sl));
    }
    minim = sc;
    for (int i = sl + 1; i < (int)l.size(); ++i)
    {
        minim = min(minim, l[i]);
        if (minim == sc && i + 1 < (int)l.size())
            d1[i + 1] = min(d1[i + 1], abs(l[i] - sc) + 1 + abs(i - sl));
        if (l[i] > minim)
            continue;
        d1[i] = min(d1[i], abs(i - sl) + l[i]);
        if (i + 1 < (int)l.size())
            d1[i + 1] = min(d1[i + 1], 1ll + abs(i - sl));
    }
    for (int i = 1; i < (int)l.size(); ++i)
        d1[i] = min(d1[i], d1[i - 1] + 1);
    for (int i = (int)l.size() - 2; i >= 0; --i)
        d1[i] = min(d1[i], d1[i + 1] + 1);
    //find min dist to finish for each row start
    ll res = d1[el] + ec;
    minim = l[el];
    for (int i = el - 1; i >= 0; --i)
    {
        minim = min(minim, l[i]);
        if (l[i] > minim)
            continue;
        res = min(res, d1[i + 1] + 1 + abs(el - i) + abs(ec - l[i]));
    }
    minim = l[el];
    for (int i = el; i + 1 < (int)l.size(); ++i)
    {
        minim = min(minim, l[i]);
        if (l[i] > minim)
            continue;
        res = min(res, d1[i + 1] + 1 + abs(el - i) + abs(ec - l[i]));
    }
    return res;
}

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<ll> l(n);
    for (ll &i : l)
        cin >> i;
    cout << calcNo1(l, sl, sc, 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...