Cod sursa(job #595180)

Utilizator SpiderManSimoiu Robert SpiderMan Data 11 iunie 2011 13:41:18
Problema Magazin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.28 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std;

const char *FIN = "magazin.in", *FOU = "magazin.out";
const int MAX = 30005, oo = 0x3f3f3f3f;

vector <int> G[MAX];
int P, N, M, D, A[3][MAX], dp[MAX][6];

void caz (int i, int CAZ) {
    if (CAZ == 0) {
        dp[i][0] =  min (dp[i][0], dp[i - 1][0] + A[0][i]);
        dp[i][0] =  min (dp[i][0], dp[i - 1][1] + A[0][i]);
        dp[i][0] =  min (dp[i][0], dp[i - 1][2] + 2 * (M + 1) + A[0][i]);
        dp[i][0] =  min (dp[i][0], dp[i - 1][3] + (M + 1) + A[0][i]);
        dp[i][0] =  min (dp[i][0], dp[i - 1][4] + (M + 1) + A[0][i]);
        dp[i][0] =  min (dp[i][0], dp[i - 1][5] + (M + 1) + A[0][i]);
    } else if (CAZ == 1) {
        dp[i][1] =  min (dp[i][1], dp[i - 1][0] + D + 2 * (M + 1));
        dp[i][1] =  min (dp[i][1], dp[i - 1][1] + min (min (A[0][i],A[1][i]) + 2 * D, A[2][i]));
        dp[i][1] =  min (dp[i][1], dp[i - 1][2] + D + 2 * (M + 1));
        dp[i][1] =  min (dp[i][1], dp[i - 1][3] + D + (M + 1));
        dp[i][1] =  min (dp[i][1], dp[i - 1][4] + D + (M + 1));
        dp[i][1] =  min (dp[i][1], dp[i - 1][5] + 3 * D + (M + 1));
    } else if (CAZ == 2) {
        dp[i][2] =  min (dp[i][2], dp[i - 1][0] + min (A[1][i], A[2][i] - 2 * D));
        dp[i][2] =  min (dp[i][2], dp[i - 1][1] + min (A[1][i], A[2][i] - 2 * D));
        dp[i][2] =  min (dp[i][2], dp[i - 1][2] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
        dp[i][2] =  min (dp[i][2], dp[i - 1][3] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
        dp[i][2] =  min (dp[i][2], dp[i - 1][4] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
        dp[i][2] =  min (dp[i][2], dp[i - 1][5] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
    } else if (CAZ == 3) {
        dp[i][3] =  min (dp[i][3], dp[i - 1][3] + A[1][i]);
        dp[i][3] =  min (dp[i][3], dp[i - 1][4] + A[1][i]);
        dp[i][3] =  min (dp[i][3], dp[i - 1][5] + 2 * (M + 1) + A[1][i]);
        dp[i][3] =  min (dp[i][3], dp[i - 1][0] + (M + 1) + A[1][i]);
        dp[i][3] =  min (dp[i][3], dp[i - 1][1] + (M + 1) + A[1][i]);
        dp[i][3] =  min (dp[i][3], dp[i - 1][2] + (M + 1) + A[1][i]);
    } else if (CAZ == 4) {
        dp[i][4] =  min (dp[i][4], dp[i - 1][0] + D + (M + 1));
        dp[i][4] =  min (dp[i][4], dp[i - 1][1] + D + (M + 1));
        dp[i][4] =  min (dp[i][4], dp[i - 1][2] + 3 * D + (M + 1));
        dp[i][4] =  min (dp[i][4], dp[i - 1][3] + D + 2 * (M + 1));
        dp[i][4] =  min (dp[i][4], dp[i - 1][4] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
        dp[i][4] =  min (dp[i][4], dp[i - 1][5] + D + 2 * (M + 1));
    } else if (CAZ == 5) {
        dp[i][5] =  min (dp[i][5], dp[i - 1][0] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
        dp[i][5] =  min (dp[i][5], dp[i - 1][1] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
        dp[i][5] =  min (dp[i][5], dp[i - 1][2] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
        dp[i][5] =  min (dp[i][5], dp[i - 1][3] + min (A[0][i], A[2][i] - 2 * D));
        dp[i][5] =  min (dp[i][5], dp[i - 1][4] + min (A[0][i], A[2][i] - 2 * D));
        dp[i][5] =  min (dp[i][5], dp[i - 1][5] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
    }
}

int main (void) {
    freopen (FIN, "r", stdin) ;

    scanf ("%d %d %d %d", &P, &N, &M, &D);
    for (int i = 0, x, y; i < P; ++i) {
        scanf ("%d %d", &x, &y) ;
        G[--x].push_back (y) ;
    }
    for (int i = 0; i < N; ++i)
        sort (G[i].begin (), G[i].end ()) ;
    for (int i = 0; i < N; ++i) {
        if (G[i].empty ()) {
            A[0][i] = A[1][i] = D, A[2][i] = 3 * D;
            continue ;
        }
        A[0][i] = D + 2 * G[i][G[i].size () - 1];
        A[1][i] = D + 2 * (M + 1 - G[i][0]) ;
        A[2][i] = min (A[0][i], A[1][i]) + 2 * D;
        for (int j = 0, k = G[i].size () - 1; j < k; ++j)
            A[2][i] = min (A[2][i], 2 * G[i][j] + 2 * (M + 1 - G[i][j + 1]) + 3 * D);
    }
    memset (dp, 0x3f, sizeof (dp)) ;
    dp[0][0] = A[0][0] - D, dp[0][1] = 2 * (M + 1), dp[0][2] = min (A[1][0] - D, A[2][0] - 3 * D);
    dp[0][3] = dp[0][5] = oo, dp[0][4] = M + 1;
    for (int i = 1; i < N; ++i)
        caz (i, 0), caz (i, 1), caz (i, 2), caz (i, 3), caz (i, 4), caz (i, 5);

    fprintf (fopen (FOU, "w"), "%d", min (dp[N - 1][0], dp[N - 1][1])) ;
}