Cod sursa(job #792806)

Utilizator danalex97Dan H Alexandru danalex97 Data 30 septembrie 2012 13:48:54
Problema Magazin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.84 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

ifstream F("magazin.in");
ofstream G("magazin.out");

const int Nmax = 30010;
const int Pmax = 50010;
const int Mmax = 30;
const int oo = 1<<30;

int N,M,P,D;
int C[Nmax][6];
vector<int> A[Nmax];
int V[Nmax][5];

void Prec()
{
    for (int i=0;i<N;++i)
        sort( A[i].begin() , A[i].end() );
    for (int i=0;i<N;++i)
    {
        if ( !A[i].size() )
        {
            V[i][1] = V[i][2] = D;
            V[i][3] = 3*D;
            continue;
        }
        int last = int( A[i].size() ) - 1;
        V[i][1] = 2 * A[i][last] + D;
        V[i][2] = 2 * ( M-A[i][0]+1 ) + D;
        V[i][3] = min(V[i][1], V[i][2])+2*D;
        for (int j=0;j<int( A[i].size() )-1;++j)
            V[i][3] = min( V[i][3] , 2*( M-A[i][j+1]+1 + A[i][j] ) + 3*D );
    }
}

void NUL(int i)
{
    C[i][0] =  min(C[i][0], C[i-1][0] + V[i][1]);
    C[i][0] =  min(C[i][0], C[i-1][1] + V[i][1]);
    C[i][0] =  min(C[i][0], C[i-1][2] + 2*(M+1) + V[i][1]);
    C[i][0] =  min(C[i][0], C[i-1][3] + (M+1) + V[i][1]);
    C[i][0] =  min(C[i][0], C[i-1][4] + (M+1) + V[i][1]);
    C[i][0] =  min(C[i][0], C[i-1][5] + (M+1) + V[i][1]);
}

void ONE(int i)
{
    C[i][1] =  min(C[i][1], C[i-1][0] + D + 2*(M+1));
    C[i][1] =  min(C[i][1], C[i-1][1] + min( min( V[i][1],V[i][2] )+2*D, V[i][3] ));
    C[i][1] =  min(C[i][1], C[i-1][2] + D + 2*(M+1));
    C[i][1] =  min(C[i][1], C[i-1][3] + D + (M+1));
    C[i][1] =  min(C[i][1], C[i-1][4] + D + (M+1));
    C[i][1] =  min(C[i][1], C[i-1][5] + 3*D + (M+1));
}

void TWO(int i)
{
    C[i][2] =  min(C[i][2], C[i-1][0] + min(V[i][2], V[i][3]-2*D));
    C[i][2] =  min(C[i][2], C[i-1][1] + min(V[i][2], V[i][3]-2*D));
    C[i][2] =  min(C[i][2], C[i-1][2] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
    C[i][2] =  min(C[i][2], C[i-1][3] + min(V[i][2], V[i][3]-2*D) + (M+1));
    C[i][2] =  min(C[i][2], C[i-1][4] + min(V[i][2], V[i][3]-2*D) + (M+1));
    C[i][2] =  min(C[i][2], C[i-1][5] + min(V[i][2], V[i][3]-2*D) + (M+1));
}

void THR(int i)
{
    C[i][3] =  min(C[i][3], C[i-1][3] + V[i][2]);
    C[i][3] =  min(C[i][3], C[i-1][4] + V[i][2]);
    C[i][3] =  min(C[i][3], C[i-1][5] + 2*(M+1) + V[i][2]);
    C[i][3] =  min(C[i][3], C[i-1][0] + (M+1) + V[i][2]);
    C[i][3] =  min(C[i][3], C[i-1][1] + (M+1) + V[i][2]);
    C[i][3] =  min(C[i][3], C[i-1][2] + (M+1) + V[i][2]);
}

void FOU(int i)
{
    C[i][4] =  min(C[i][4], C[i-1][3] + D + 2*(M+1));
    C[i][4] =  min(C[i][4], C[i-1][4] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
    C[i][4] =  min(C[i][4], C[i-1][5] + D + 2*(M+1));
    C[i][4] =  min(C[i][4], C[i-1][0] + D + (M+1));
    C[i][4] =  min(C[i][4], C[i-1][1] + D + (M+1));
    C[i][4] =  min(C[i][4], C[i-1][2] + 3*D + (M+1));
}

void FIV(int i)
{
    C[i][5] =  min(C[i][5], C[i-1][3] + min(V[i][1], V[i][3]-2*D));
    C[i][5] =  min(C[i][5], C[i-1][4] + min(V[i][1], V[i][3]-2*D));
    C[i][5] =  min(C[i][5], C[i-1][5] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
    C[i][5] =  min(C[i][5], C[i-1][0] + min(V[i][1], V[i][3]-2*D) + (M+1));
    C[i][5] =  min(C[i][5], C[i-1][1] + min(V[i][1], V[i][3]-2*D) + (M+1));
    C[i][5] =  min(C[i][5], C[i-1][2] + min(V[i][1], V[i][3]-2*D) + (M+1));
}

int main()
{
    F>>P>>N>>M>>D;
    for (int i=1;i<=P;++i)
    {
        int x,y;
        F>>x>>y; x--;
        A[x].push_back( y );
    }

    Prec();
    memset(C, 0x3f, sizeof(C));

    C[0][0] = V[0][1]-D;
    C[0][1] = 2*(M+1);
    C[0][2] = min(V[0][2]-D, V[0][3]-3*D);
    C[0][3] = oo;
    C[0][4] = M+1;
    C[0][5] = oo;

    for (int i=1;i<N;++i)
    {
        NUL( i ), ONE( i ), TWO( i );
        THR( i ), FOU( i ), FIV( i );
    }

    int Res = min(C[N-1][0], C[N-1][1]);
    G<<Res<<'\n';

    F.close();
    G.close();
    return 0;
}