Cod sursa(job #1778549)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 13 octombrie 2016 21:31:40
Problema Magazin Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.91 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 30050
#define MAXM 26
#define MAXP 50050
#define inf 0x3f3f3f3f

using namespace std;

struct coord
{
    int x, y;
    coord(int x = 0, int y = 0) : x(x), y(y) { }
};
coord want[MAXP];
int din[MAXN][10];
int culoar[MAXN][MAXM];
int tj[MAXN], ts[MAXN], parti[MAXN];
int p, n, m, d;

void prepare()
{
    for (int i = 1; i <= n; i++) {
        if (culoar[i][0] < 1) {
            tj[i] = d;
            ts[i] = d;
            parti[i] = 2*d;
            continue;
        }
        sort(culoar[i]+1, culoar[i] + culoar[i][0]+1);
        tj[i] = d+2*culoar[i][culoar[i][0]];
        ts[i] = d+2*(m+1-culoar[i][1]);
        parti[i] = d + min(tj[i]+d, ts[i]+d);

        for (int j = 1; j <= culoar[i][0]; j++) {
            parti[i] = min(parti[i], 2*d + 2*(culoar[i][j]+m+1-culoar[i][j+1]));
        }
    }
}

void solve()
{
	for (int i = 0; i <= n; i++)
		for (int j = 0; j < 6; j++)
			din[i][j] = inf;
	din[1][0] = tj[1]-d;
	din[1][1] = 2*(m+1);
	din[1][2] = min(ts[1]-d, parti[1]-3*d);
	din[1][4] = m+1;
    for (int i = 2; i <= n; i++) {
        din[i][0] = min(din[i][0], din[i-1][0] + tj[i]);
        din[i][0] = min(din[i][0], din[i-1][1] + tj[i]);
        din[i][0] = min(din[i][0], din[i-1][2] + 2*(m+1)+tj[i]);
        din[i][0] = min(din[i][0], din[i-1][3] + m+1+tj[i]);
        din[i][0] = min(din[i][0], din[i-1][4] + m+1+tj[i]);
        din[i][0] = min(din[i][0], din[i-1][5] + m+1+tj[i]);

        din[i][1] = min(din[i][1], din[i-1][0] + d + 2*(m+1));
        din[i][1] = min(din[i][1], din[i-1][1] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
        din[i][1] = min(din[i][1], din[i-1][2] + d + 2*(m+1));
        din[i][1] = min(din[i][1], din[i-1][3] + d + (m+1));
        din[i][1] = min(din[i][1], din[i-1][4] + d + (m+1));
        din[i][1] = min(din[i][1], din[i-1][5] + 3*d + (m+1));

        din[i][2] = min(din[i][2], din[i-1][0] + min(ts[i], parti[i]-d));
        din[i][2] = min(din[i][2], din[i-1][1] + min(ts[i], parti[i]-d));
        din[i][2] = min(din[i][2], din[i-1][2] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
        din[i][2] = min(din[i][2], din[i-1][3] + min(ts[i], parti[i]-d) + m+1);
        din[i][2] = min(din[i][2], din[i-1][4] + min(ts[i], parti[i]-d) + m+1);
        din[i][2] = min(din[i][2], din[i-1][5] + min(ts[i], parti[i]-d) + m+1);

        din[i][3] = min(din[i][3], din[i-1][0] + m+1 + ts[i]);
        din[i][3] = min(din[i][3], din[i-1][1] + m+1 + ts[i]);
        din[i][3] = min(din[i][3], din[i-1][2] + m+1 + ts[i]);
        din[i][3] = min(din[i][3], din[i-1][3] + ts[i]);
        din[i][3] = min(din[i][3], din[i-1][4] + ts[i]);
        din[i][3] = min(din[i][3], din[i-1][5] + 2*(m+1) + ts[i]);

		din[i][4] = min(din[i][4], din[i-1][0] + d + m + 1);
        din[i][4] = min(din[i][4], din[i-1][1] + d + m + 1);
        din[i][4] = min(din[i][4], din[i-1][2] + 3*d + m+1);
        din[i][4] = min(din[i][4], din[i-1][3] + d + 2*(m+1));
        din[i][4] = min(din[i][4], din[i-1][4] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
        din[i][4] = min(din[i][4], din[i-1][5] + d + 2*(m+1));

        din[i][5]  = min(din[i][5], din[i-1][0] + min(tj[i], parti[i]-d) + m+1);
        din[i][5]  = min(din[i][5], din[i-1][1] + min(tj[i], parti[i]-d) + m+1);
        din[i][5]  = min(din[i][5], din[i-1][2] + min(tj[i], parti[i]-d) + m+1);
        din[i][5]  = min(din[i][5], din[i-1][3] + min(tj[i], parti[i]-d));
        din[i][5]  = min(din[i][5], din[i-1][4] + min(tj[i], parti[i]-d));
        din[i][5]  = min(din[i][5], din[i-1][5] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
    }
    printf("%d", min(din[n][0], din[n][1]));
}

int main()
{
    freopen("magazin.in", "r", stdin);
    freopen("magazin.out", "w", stdout);

    scanf("%d %d %d %d", &p, &n, &m, &d);
    for (int i = 1; i <= p; i++) {
        scanf("%d %d", &want[i].x, &want[i].y);
        culoar[want[i].x][++culoar[want[i].x][0]] = want[i].y;
    }
    prepare();
    solve();

    return 0;
}