Cod sursa(job #2124788)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 7 februarie 2018 16:42:34
Problema Magazin Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.51 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int nmax = 3e4;
const int inf = 1 << 29;

int d[ 2 ][ 6 ];
int c[nmax + 1][ 3 ];

vector< int > ob[nmax + 1];

inline int min4 (int a, int b, int x, int y) {
    return min(min(a, b), min(x, y));
}

inline int min5 (int a, int b, int x, int y, int t) {
    return min(min4(a, b, x, y), t);
}

int main() {
    int p, n, m, D;
    fin >> p >> n >> m >> D;

    for (int i = 0; i < p; ++ i) {
        int x, y;
        fin >> x >> y;
        ob[ x ].push_back( y );

        c[ x ][ 0 ] = max(c[ x ][ 0 ], 2 * y);
        c[ x ][ 1 ] = max(c[ x ][ 1 ], 2 * (m + 1 - y));
    }

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

        ob[ i ].push_back( 0 );
        ob[ i ].push_back(m + 1);

        sort(ob[ i ].begin(), ob[ i ].end());
        for (int j = 1; j < (int)ob[ i ].size(); ++ j) {
            c[ i ][ 2 ] = min(c[ i ][ 2 ], 2 * (m + 1 - ob[ i ][ j ] + ob[ i ][j - 1]));
        }
    }

    for (int i = 0; i < 6; ++ i) {
        d[ 0 ][ i ] = inf;
    }
    d[ 0 ][ 0 ] = 0;


    int ind = 1;
    for (int i = 1; i <= n; ++ i, ind = 1 - ind) {
        d[ ind ][ 0 ] = min5(d[ !ind ][ 0 ] + c[ i ][ 0 ],
                            d[ !ind ][ 1 ] + m + 1,
                            d[ !ind ][ 2 ] + 2 * (m + 1),
                            d[ !ind ][ 3 ] + m + 1,
                            d[ !ind ][ 4 ] + c[ i ][ 2 ]) + D;

        d[ ind ][ 1 ] = min5(d[ !ind ][ 0 ] + m + 1,
                            d[ !ind ][ 1 ] + c[ i ][ 1 ],
                            d[ !ind ][ 2 ] + m + 1,
                            d[ !ind ][ 3 ] + 2 * (m + 1),
                            d[ !ind ][ 5 ] + c[ i ][ 2 ]) + D;

        d[ ind ][ 2 ] = min(d[ !ind ][ 0 ] + c[ i ][ 2 ],
                            d[ !ind ][ 2 ] + c[ i ][ 2 ]) + 3 * D;

        d[ ind ][ 3 ] = min(d[ !ind ][ 1 ] + c[ i ][ 2 ],
                            d[ !ind ][ 3 ] + c[ i ][ 2 ]) + 3 * D;

        d[ ind ][ 4 ] = min4(d[ !ind ][ 1 ] + m + 1,
                            d[ !ind ][ 2 ] + 2 * (m + 1),
                            d[ !ind ][ 3 ] + m + 1,
                            d[ !ind ][ 4 ] + c[ i ][ 2 ]) + 3 * D;

        d[ ind ][ 5 ] = min4(d[ !ind ][ 0 ] + m + 1,
                            d[ !ind ][ 2 ] + m + 1,
                            d[ !ind ][ 3 ] + 2 * (m + 1),
                            d[ !ind ][ 5 ] + c[ i ][ 2 ]) + 3 * D;
    }

    ind = 1 - ind;
    fout << d[ ind ][ 0 ] - D << "\n";
    return 0;
}