Cod sursa(job #2366036)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 4 martie 2019 18:10:17
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("panza.in");
ofstream fout("panza.out");

int n, m, s, f, a[100005], d[1005][1005], b[100005], c[100005];
pair <int, int> e[100005];
int main()
{
    fin >> n >> m >> s >> f;

    for(int i = 1; i <= m; i++)
        fin >> a[i];


    for(int i = 1; i <= m ; i++)
        for(int j = i; j <= m; j++)
        {
            if(i == j)
                d[i][j] = min(a[i], d[i-1][j-1]+2);
            else
                d[i][j] = min(d[i][j-1]+1, j-i+a[j]);
        }

    for(int i = 1; i <= n; i++)
    {
        int x, y;
        fin >> x >> y;
        e[i].first = x;
        e[i].second = y;
    }

    for(int i = e[1].first; i <= e[1].second; i++)
        b[i] = abs(s-i);

    for(int i = 2; i <= n; i++)
    {
        for(int k = 1; k <= m; k++) c[k] = (1<<30);

        for(int k = e[i].first; k <= e[i].second; k++)
        {
            for(int p = e[i-1].first; p <= e[i-1].second; p++)
            {
                c[k] = min(c[k],d[min(p,k)][max(p,k)] + b[p]);
            }
        }
       for(int k = 1; k <= m; k++)
            b[k] = c[k];


    }
        int ans = (1<<30);

        for(int i = e[n].first; i <= e[n].second; i++)
            ans = min(ans, abs(f-i)+b[i]);
        fout << ans;


    return 0;
}