Cod sursa(job #87436)

Utilizator victorsbVictor Rusu victorsb Data 27 septembrie 2007 12:09:39
Problema Euro Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>

#define Nmax 50005
#define ll long long

int n, t, st, dr;
int sir[Nmax];
ll g[Nmax], c[Nmax];
ll sum[Nmax];
ll d[Nmax];
int Q[Nmax];

void citire()
{
	int i;

	scanf("%d %d", &n, &t);
	for (i = 1; i <= n; ++i)
		scanf("%d", &sir[i]);
}

double f(int k1, int k2)
{
	double ret = 0;

	ret = (d[k1 + 1] - d[k2 + 1]);
	ret += (double)(sum[k1] * c[k1]);
	ret -= (double)(sum[k2] * c[k2]);
	ret /= (c[k1] - c[k2]);

	return ret;
}

void solve()
{
	int i, ct;
	ll suma;

	suma = ct = 0;
    for (i = 1; i <= n; ++i)
	{
		suma += sir[i];
		if (suma < 0)
		{
			g[++ct] = suma;
			c[ct] = i;
			suma = 0;
		}
	}
    if (suma != 0)
	{
		g[++ct] = suma;
		c[ct] = n;
	}

	n = ct;

	for (i = 1; i <= n + 1; ++i)
		sum[i] = sum[i - 1] + g[i];

	st = 1;
	dr = 0;

	for (i = n; i >= 1; --i)
	{
		while (st < dr && f(Q[dr - 1], Q[dr]) > f(Q[dr], i)) --dr;
		Q[++dr] = i;
 
		while (st < dr && (double)sum[i - 1] >= f(Q[st], Q[st + 1])) ++st;

		d[i] = d[Q[st] + 1] + (sum[Q[st]] - sum[i - 1]) * c[Q[st]] - t;
	}

	printf("%lld\n", d[1]);
}

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

	citire();
	solve();
	
	return 0;
}